1 //poj3580 2 //#pragma comment(linker,"/STACK:102400000,102400000") 3 #include <cstdio> 4 #include <set> 5 #include <map> 6 #include <ctime> 7 #include <cctype> 8 #include <string> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <assert.h> 13 #include <algorithm> 14 #include <iostream> 15 #include <climits> 16 #include <queue> 17 #include <vector> 18 19 #define dte(x) cout << #x << " = " << x << endl; 20 #define scaf2(x,y) scaf(x);scaf(y); 21 #define mkp make_pair 22 23 using namespace std; 24 template<typename T>inline void scaf(T&v) 25 { 26 char ch = getchar(); 27 for(; ch < '0' || ch > '9'; ch = getchar()); 28 for(v = 0; ch >= '0' && ch <= '9'; ch = getchar()) v = (v << 1) +(v << 3) + ch - '0'; 29 } 30 typedef long long LL; 31 typedef unsigned long long ULL; 32 typedef pair <int, int> PII; 33 const int maxN = 2e5 + 10; 34 const LL mod = 1e9 + 7; 35 const double eps = 1e-9; 36 const LL oo = ~ 0U >> 2; 37 38 int inn[maxN]; 39 40 struct SplayTree 41 { 42 static const int smaxN = 4e5 + 10; 43 #define keyNode chird[chird[root][1]][0] 44 int item[smaxN]; 45 int parent[smaxN]; 46 int sz[smaxN]; 47 int chird[smaxN][2]; 48 49 int root, vtot; 50 51 SplayTree() 52 { 53 root = vtot = 0; 54 item[0] = -1; 55 parent[0] = sz[0] = chird[0][0] = chird[0][1] = 0; 56 } 57 58 void Rotate(const int& x, const int& lr) 59 {//lr - > 0: leftRotate 1: rightRotate 60 int y = parent[x]; 61 pushDown(y); pushDown(x); 62 chird[y][! lr] = chird[x][lr]; 63 if (chird[x][lr]) parent[chird[x][lr]] = y; 64 parent[x] = parent[y]; 65 if (parent[y]) 66 { 67 if (chird[parent[y]][0] == y) chird[parent[y]][0] = x; 68 else chird[parent[y]][1] = x; 69 } 70 chird[x][lr] = y; parent[y] = x; 71 pushUp(y); 72 } 73 74 void Splay(int x, const int& target) 75 {//Splay x to target't chird -- target must be x's ancestor 76 for (pushDown(x); parent[x] != target;) 77 { 78 if (parent[parent[x]] == target)/*x's father's father is target -> rotate x to x's father*/ 79 { 80 if (chird[parent[x]][0] == x) Rotate(x, 1); 81 else Rotate(x, 0); 82 }else 83 { 84 int y = parent[x], z = parent[parent[x]]; 85 if (chird[z][0] == y)/*y is z's lson*/ 86 { 87 if (chird[y][0] == x) Rotate(y, 1), Rotate(x, 1);//yi zi xing 88 else Rotate(x, 0), Rotate(x, 1);//zhi zi xing 89 }else 90 { 91 if (chird[y][0] == x) Rotate(x, 1), Rotate(x, 0);//zhi 92 else Rotate(y, 0), Rotate(x, 0);//yi 93 } 94 } 95 } 96 pushUp(x); 97 if (!target) root = x; 98 } 99 100 int Search(const int& target) 101 { 102 int x = root; 103 while (x) 104 { 105 if (item[x] == target) break; 106 if (item[x] > target) x = chird[x][0]; 107 else x = chird[x][1]; 108 } 109 if (x) Splay(x, 0); 110 return x; 111 } 112 113 void Insert(const int& target, const int& _id) 114 { 115 // if (Search(target)) return;//exist? 116 int x = root, y = 0, lr; 117 while (x) 118 { 119 y = x; ++ sz[y]; 120 if (item[x] > target) x = chird[x][0]; 121 else x = chird[x][1]; 122 } 123 if (item[y] > target) lr = 0; 124 else lr = 1; 125 sz[x = ++ vtot] = 1; 126 parent[x] = y; chird[y][lr] = x; 127 item[x] = target; 128 chird[x][0] = chird[x][1] = 0; 129 Splay(x, 0); 130 } 131 132 void Delete(const int& target) 133 { 134 int x = Search(target); 135 if (!x) return;//no exist 136 int lc = chird[x][0], rc = chird[x][1]; 137 sz[x] = parent[lc] = parent[rc] = chird[x][0] = chird[x][1] = 0; 138 if (!lc) root = rc; 139 else 140 { 141 for (pushDown(lc); chird[lc][1]; pushDown(lc)) lc = chird[lc][1]; 142 Splay(lc, 0); 143 parent[rc] = lc; 144 chird[lc][1] = rc; 145 pushUp(root); 146 } 147 } 148 149 int findParent(const int& target) 150 { 151 int x = root, ret = 0; 152 while (x) 153 { 154 if (target <= item[x]) x = chird[x][0]; 155 else ret = x, x = chird[x][1]; 156 } 157 if (ret) Splay(ret, 0); 158 return ret; 159 } 160 161 int findSuccessor(const int& target) 162 { 163 int x = root, ret = 0; 164 while (x) 165 { 166 if (target >= item[x]) x = chird[x][1]; 167 else ret = x, x = chird[x][0]; 168 } 169 if (ret) Splay(ret, 0); 170 return ret; 171 } 172 173 int findKth(int k, const int& target) 174 { 175 int x = root; 176 while (x) 177 { 178 pushDown(x); 179 int y = sz[chird[x][0]]; 180 if (y == k) break; 181 if (y > k) x = chird[x][0]; 182 else x = chird[x][1], k -= y + 1; 183 } 184 if (x) Splay(x, target); 185 return x;//item[x]??? 186 } 187 188 void Treaval(const int& x, int& num) 189 { 190 if (x) 191 { 192 pushDown(x); 193 Treaval(chird[x][0], num); 194 printf("%d", item[x]); 195 if (-- num) putchar(32); 196 else putchar(10); 197 Treaval(chird[x][1], num); 198 } 199 } 200 201 void outPut(int n) 202 { 203 int m = n; 204 findKth(0, 0); 205 Treaval(root, m); 206 } 207 208 void newNode(int& x, const int& val, const int& father) 209 { 210 item[x = ++ vtot] = val; sz[x] = 1; parent[x] = father; 211 minVal[x] = val; rev[x] = false; addLazy[x] = 0; 212 chird[x][0] = chird[x][1] = 0; 213 } 214 215 void buildSplay(int n) 216 { 217 root = vtot = 0; 218 item[0] = 0; rev[0] = 0; addLazy[0] = 0; minVal[0] = oo; 219 parent[0] = sz[0] = chird[0][0] = chird[0][1] = 0; 220 newNode(root, oo, 0);//ex node? 221 newNode(chird[root][1], oo, root); 222 buildTree(keyNode, 1, n, chird[root][1]); 223 pushUp(chird[root][1]); 224 pushUp(root); 225 } 226 227 void buildTree(int& x, const int& l, const int& r, const int& father) 228 { 229 if (l > r) return; 230 int mid = l + r >> 1; 231 newNode(x, inn[mid], father); 232 buildTree(chird[x][0], l, mid - 1, x); 233 buildTree(chird[x][1], mid + 1, r, x); 234 pushUp(x); 235 } 236 237 void pushUp(const int& x) 238 { 239 sz[x] = sz[chird[x][0]] + sz[chird[x][1]] + 1; 240 minVal[x] = item[x]; 241 if (chird[x][0]) minVal[x] = min(minVal[x], minVal[chird[x][0]]); 242 if (chird[x][1]) minVal[x] = min(minVal[x], minVal[chird[x][1]]);; 243 } 244 245 void pushDown(const int& x) 246 { 247 if (rev[x]) 248 { 249 int lc = chird[x][0], rc = chird[x][1]; 250 swap(chird[x][0], chird[x][1]); 251 if (lc) rev[lc] ^= 1; 252 if (rc) rev[rc] ^= 1; 253 rev[x] ^= 1; 254 } 255 if (addLazy[x]) 256 { 257 if (chird[x][0]) 258 { 259 item[chird[x][0]] += addLazy[x]; 260 minVal[chird[x][0]] += addLazy[x]; 261 addLazy[chird[x][0]] += addLazy[x]; 262 } 263 if (chird[x][1]) 264 { 265 item[chird[x][1]] += addLazy[x]; 266 minVal[chird[x][1]] += addLazy[x]; 267 addLazy[chird[x][1]] += addLazy[x]; 268 } 269 addLazy[x] = 0; 270 } 271 } 272 273 void add(const int& l, const int& r, const int& v) 274 { 275 findKth(l - 1, 0); findKth(r + 1, root); 276 item[keyNode] += v; 277 addLazy[keyNode] += v; 278 minVal[keyNode] += v; 279 Splay(keyNode, 0); 280 } 281 282 void insVal(const int& l, const int& v) 283 { 284 findKth(l, 0); findKth(l + 1, root); 285 if (keyNode) while (1); 286 newNode(keyNode, v, chird[root][1]); 287 Splay(keyNode, 0); 288 } 289 290 void del(const int& target) 291 { 292 findKth(target, 0); 293 pushDown(root); 294 int x = root; 295 int lc = chird[x][0], rc = chird[x][1]; 296 sz[x] = parent[lc] = parent[rc] = chird[x][0] = chird[x][1] = 0; 297 if (!lc) root = rc; 298 else 299 { 300 for (pushDown(lc); chird[lc][1]; pushDown(lc)) lc = chird[lc][1]; 301 Splay(lc, 0); 302 parent[rc] = lc; 303 chird[lc][1] = rc; 304 pushUp(root); 305 } 306 } 307 308 int getMin(const int& l, const int& r) 309 { 310 findKth(l - 1, 0); findKth(r + 1, root); 311 return minVal[keyNode]; 312 } 313 314 void Reverse(const int& l, const int& r) 315 { 316 findKth(l - 1, 0); findKth(r + 1, root); 317 rev[keyNode] ^= 1; 318 Splay(keyNode, 0); 319 } 320 321 void Revolve(const int& l, const int& r, const int& v) 322 { 323 int rr = r - v; 324 int ll = rr + 1; 325 findKth(ll - 1, 0); findKth(r + 1, root); 326 int x = keyNode; keyNode = 0; parent[x] = 0; 327 pushUp(chird[root][1]); pushUp(root); 328 findKth(l - 1, 0); findKth(l, root); 329 keyNode = x; 330 parent[keyNode] = chird[root][1]; 331 pushUp(chird[root][1]); pushUp(root); 332 Splay(keyNode, 0); 333 } 334 335 int minVal[smaxN]; 336 int addLazy[smaxN]; 337 bool rev[smaxN]; 338 }spt; 339 340 int main() 341 { 342 // freopen("ok.out", "w", stdout); 343 int n, i, m; 344 int l, r, v; 345 char opt[10]; 346 // scaf(n); 347 scanf("%d", &n); 348 for (i = 1; i <= n; ++ i) 349 // scaf(inn[i]); 350 scanf("%d", &inn[i]); 351 spt.buildSplay(n); 352 // scaf(m); 353 scanf("%d", &m); 354 while (m --) 355 { 356 scanf("%s", opt); 357 // printf("%s ", opt); 358 if ('A' == opt[0]) 359 { 360 // scaf2(l, r); scaf(v); 361 scanf("%d%d%d", &l, &r, &v); 362 spt.add(l, r, v); 363 }else if ('I' == opt[0]) 364 { 365 // scaf2(l, v); 366 scanf("%d%d", &l, &v); 367 spt.insVal(l, v); 368 }else if ('D' == opt[0]) 369 { 370 // scaf(v); 371 scanf("%d", &v); 372 spt.del(v); 373 // spt.outPut(spt.sz[spt.root]); 374 }else if ('M' == opt[0]) 375 { 376 // scaf2(l, r); 377 scanf("%d%d", &l, &r); 378 printf("%d ", spt.getMin(l, r)); 379 }else if ('E' == opt[3]) 380 { 381 // scaf2(l, r); 382 scanf("%d%d", &l, &r); 383 spt.Reverse(l, r); 384 // spt.outPut(spt.sz[spt.root]); 385 }else 386 { 387 // scaf2(l, r); scaf(v); 388 scanf("%d%d%d", &l, &r, &v); 389 int len = r - l + 1; 390 v = (v % len + len) % len; 391 if (v) spt.Revolve(l, r, v); 392 } 393 spt.findKth(0, 0); 394 // spt.outPut(spt.sz[spt.root]); 395 // printf("%d ", spt.sz[spt.root]); 396 } 397 return 0; 398 }