发现每一次的建造相当于插入一个$(l,r,v)$,就是个区间……
然后这个可以用$set$维护一下……
没了……
据说叫做$ODT$……(某次codeforces的毒瘤题)
好吧似乎只是运用了$ODT$维护数据的思想……
1 %:pragma GCC optimize(2) 2 %:pragma GCC optimize(3) 3 %:pragma GCC optimize("Ofast") 4 %:pragma GCC optimize("inline") 5 %:pragma GCC optimize("-fgcse") 6 %:pragma GCC optimize("-fgcse-lm") 7 %:pragma GCC optimize("-fipa-sra") 8 %:pragma GCC optimize("-ftree-pre") 9 %:pragma GCC optimize("-ftree-vrp") 10 %:pragma GCC optimize("-fpeephole2") 11 %:pragma GCC optimize("-ffast-math") 12 %:pragma GCC optimize("-fsched-spec") 13 %:pragma GCC optimize("unroll-loops") 14 %:pragma GCC optimize("-falign-jumps") 15 %:pragma GCC optimize("-falign-loops") 16 %:pragma GCC optimize("-falign-labels") 17 %:pragma GCC optimize("-fdevirtualize") 18 %:pragma GCC optimize("-fcaller-saves") 19 %:pragma GCC optimize("-fcrossjumping") 20 %:pragma GCC optimize("-fthread-jumps") 21 %:pragma GCC optimize("-funroll-loops") 22 %:pragma GCC optimize("-fwhole-program") 23 %:pragma GCC optimize("-freorder-blocks") 24 %:pragma GCC optimize("-fschedule-insns") 25 %:pragma GCC optimize("inline-functions") 26 %:pragma GCC optimize("-ftree-tail-merge") 27 %:pragma GCC optimize("-fschedule-insns2") 28 %:pragma GCC optimize("-fstrict-aliasing") 29 %:pragma GCC optimize("-fstrict-overflow") 30 %:pragma GCC optimize("-falign-functions") 31 %:pragma GCC optimize("-fcse-skip-blocks") 32 %:pragma GCC optimize("-fcse-follow-jumps") 33 %:pragma GCC optimize("-fsched-interblock") 34 %:pragma GCC optimize("-fpartial-inlining") 35 %:pragma GCC optimize("no-stack-protector") 36 %:pragma GCC optimize("-freorder-functions") 37 %:pragma GCC optimize("-findirect-inlining") 38 %:pragma GCC optimize("-fhoist-adjacent-loads") 39 %:pragma GCC optimize("-frerun-cse-after-loop") 40 %:pragma GCC optimize("inline-small-functions") 41 %:pragma GCC optimize("-finline-small-functions") 42 %:pragma GCC optimize("-ftree-switch-conversion") 43 %:pragma GCC optimize("-foptimize-sibling-calls") 44 %:pragma GCC optimize("-fexpensive-optimizations") 45 %:pragma GCC optimize("-funsafe-loop-optimizations") 46 %:pragma GCC optimize("inline-functions-called-once") 47 %:pragma GCC optimize("-fdelete-null-pointer-checks") 48 49 #include <bits/stdc++.h> 50 using namespace std; 51 typedef long long ll; 52 struct T { int l, r, v; }; 53 bool operator < (T a, T b) { return a.r < b.r; } 54 set<T> s; 55 int m; ll c; 56 57 inline int maintain(int l, int r, int v) { 58 int tot = (r - l + 1) / v; 59 if((r - l + 1) % v != 0) { 60 return l + tot * v; 61 } else { 62 return l + (tot - 1) * v; 63 } 64 } 65 66 void ins(int l, int r, int v) { 67 if(l > r) return ; 68 r = maintain(l, r, v); 69 s.insert((T) { l, r, v }); 70 } 71 72 void split(int pos) { 73 if(s.size()) { 74 auto cs = s.lower_bound((T) { 0, pos, 0 }); 75 if(cs == s.end() || cs -> r == pos) return; 76 if(cs -> l <= pos) { 77 int v = cs -> v; 78 int l1 = cs -> l, r1 = pos; 79 r1 = maintain(l1, r1, v); 80 int l2 = r1 + v, r2 = cs -> r; 81 r2 = maintain(l2, r2, v); 82 s.erase(cs); 83 ins(l1, r1, v); 84 ins(l2, r2, v); 85 } 86 } 87 } 88 89 void del(int l, int r) { 90 split(r); 91 split(l - 1); 92 while(s.size()) { 93 auto cs = s.lower_bound((T) { 0, l, 0 }); 94 if(cs == s.end() || cs -> l > r) break; 95 s.erase(cs); 96 } 97 } 98 99 ll query(int pos) { 100 if(s.empty()) return 0; 101 split(pos); 102 int d1 = 1e9 + 1, d2 = 1e9 + 1; 103 auto cs = s.lower_bound((T) { 0, pos, 0 }); 104 if(cs != s.end()) { 105 if(cs -> l <= pos) { 106 int l = cs -> l, r = cs -> r, v = cs -> v; 107 d1 = pos - maintain(l, pos, v); 108 d2 = maintain(pos, r, v) - pos; 109 } else { 110 d1 = cs -> l - pos; 111 if(cs != s.begin()) d2 = pos - (-- cs) -> r; 112 } 113 } else { 114 d1 = pos - (-- cs) -> r; 115 } 116 ll res = min(d1, d2); 117 return res * res; 118 } 119 120 int main() { 121 freopen("cellphone.in", "r", stdin); 122 freopen("cellphone.out", "w", stdout); 123 scanf("%d%lld", &m, &c); 124 for(int i = 1 ; i <= m ; ++ i) { 125 char op[20]; int l, r, v; 126 scanf("%s", op); 127 if(op[0] == 'c') { 128 scanf("%d%d%d", &l, &r, &v); 129 split(r), split(l - 1); 130 ins(l, r, v); 131 } else if(op[0] == 'd') { 132 scanf("%d%d", &l, &r); 133 del(l, r); 134 } else if(op[0] == 'q') { 135 scanf("%d", &v); 136 printf("%lld\n", s.size() ? max(0ll, c - query(v)) : 0ll); 137 } 138 } 139 }