1
+ #include < bits/stdc++.h>
2
+
3
+ using namespace std ;
4
+ const int inf = 1e9 + 7 , N = 1e5 + 5 ;
5
+
6
+ struct seg_tree {
7
+ int n;
8
+ vector< int > a, mi, lz;
9
+ seg_tree (const vector< int > &v) : a(v) {
10
+ n = a.size ();
11
+ mi.resize (n * 4 );
12
+ lz.resize (n * 4 );
13
+ build (1 , 0 , n);
14
+ }
15
+ void build (int id, int l, int r) {
16
+ lz[id] = 0 ;
17
+ if (r-l < 2 ) {
18
+ mi[id] = a[l];
19
+ return ;
20
+ }
21
+ int mid = (l + r) >> 1 , il = id << 1 , ir = il | 1 ;
22
+ build (il, l, mid);
23
+ build (ir, mid, r);
24
+ mi[id] = min (mi[il], mi[ir]);
25
+ }
26
+ void shift (int id) {
27
+ if (lz[id]) {
28
+ int il = id << 1 , ir = il | 1 ;
29
+ mi[il] = lz[il] = mi[ir] = lz[ir] = lz[id];
30
+ lz[id] = 0 ;
31
+ }
32
+ }
33
+ void upd (int x, int y, int v, int id, int l, int r) {
34
+ if (x >= r || l >= y) return ;
35
+ if (x <= l && r <= y) {
36
+ mi[id] = lz[id] = v;
37
+ return ;
38
+ }
39
+ shift (id);
40
+ int mid = (l + r) >> 1 , il = id << 1 , ir = il | 1 ;
41
+ upd (x, y, v, il, l, mid);
42
+ upd (x, y, v, ir, mid, r);
43
+ mi[id] = min (mi[il], mi[ir]);
44
+ }
45
+ int get (int x, int y, int id, int l, int r) {
46
+ if (x >= r || l >= y) return inf;
47
+ if (x <= l && r <= y) {
48
+ return mi[id];
49
+ }
50
+ shift (id);
51
+ int mid = (l + r) >> 1 , il = id << 1 , ir = il | 1 ;
52
+ return min (get (x, y, il, l, mid), get (x, y, ir, mid, r));
53
+ }
54
+ };
55
+
56
+ vector< int > a;
57
+ vector< int > b;
58
+ int l[N], r[N];
59
+ int t[N], v[N];
60
+
61
+ int main () {
62
+ a.clear ();
63
+ b.clear ();
64
+ int n, k, q;
65
+ scanf (" %d %d" , &n, &k);
66
+ int mall = inf;
67
+ for (int i = 0 ; i < n; i++) {
68
+ int x;
69
+ scanf (" %d" , &x);
70
+ a.push_back (x);
71
+ mall = min (mall, x);
72
+ }
73
+ seg_tree seg (a);
74
+ vector< int > batas;
75
+ batas.push_back (0 );
76
+ batas.push_back (n * k);
77
+ scanf (" %d" , &q);
78
+ for (int i = 0 ; i < q; i++) {
79
+ scanf (" %d %d %d" , t+i, l+i, r+i);
80
+ l[i]--;
81
+ if (t[i] == 1 )
82
+ scanf (" %d" , v+i);
83
+ batas.push_back (l[i]);
84
+ batas.push_back (r[i]);
85
+ }
86
+ sort (batas.begin (), batas.end ());
87
+ batas.erase (unique (batas.begin (), batas.end ()), batas.end ());
88
+ for (int i = 0 ; i + 1 < batas.size (); i++) {
89
+ int le = batas[i], ri = batas[i+1 ];
90
+ if (ri-le >= n)
91
+ b.push_back (mall);
92
+ else {
93
+ ri %= n;
94
+ if (ri == 0 ) ri = n;
95
+ le %= n;
96
+ if (le < ri)
97
+ b.push_back (seg.get (le, ri, 1 , 0 , n));
98
+ else
99
+ b.push_back (min (seg.get (le, n, 1 , 0 , n), seg.get (0 , ri, 1 , 0 , n)));
100
+ }
101
+ }
102
+ seg_tree smi (b);
103
+ for (int i = 0 ; i < q; i++) {
104
+ l[i] = lower_bound (batas.begin (), batas.end (), l[i]) - batas.begin ();
105
+ r[i] = lower_bound (batas.begin (), batas.end (), r[i]) - batas.begin ();
106
+ assert (l[i] >= 0 && l[i] < b.size ());
107
+ assert (r[i] > 0 && r[i] <= b.size ());
108
+ assert (l[i] < r[i]);
109
+ if (t[i] == 1 )
110
+ smi.upd (l[i], r[i], v[i], 1 , 0 , b.size ());
111
+ else
112
+ printf (" %d\n " , smi.get (l[i], r[i], 1 , 0 , b.size ()));
113
+ }
114
+ return 0 ;
115
+ }
0 commit comments