主席树裸上就好了。。。不过写了一会儿。。。因为姿势比较厉(gui)害(chu)
1 /************************************************************** 2 Problem: 3932 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:2868 ms 7 Memory:98560 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 13 using namespace std; 14 typedef long long ll; 15 const int N = 1e5 + 5; 16 const int P = 1e7; 17 18 inline int read(); 19 20 struct chair_tree { 21 chair_tree *ls, *rs; 22 int sz; 23 ll sum; 24 25 #define Len (1 << 16) 26 void* operator new(size_t, int x, ll y, chair_tree *L = NULL, chair_tree *R = NULL) { 27 static chair_tree *mempool, *c; 28 if (c == mempool) 29 mempool = (c = new chair_tree[Len]) + Len; 30 c -> ls = L, c -> rs = R, c -> sz = x, c -> sum = y; 31 return c++; 32 } 33 void* operator new(size_t, chair_tree *p) { 34 static chair_tree *mempool, *c; 35 if (c == mempool) 36 mempool = (c = new chair_tree[Len]) + Len; 37 *c = *p; 38 return c++; 39 } 40 #undef Len 41 42 #define mid (l + r >> 1) 43 void modify(int l, int r, int pos, int d_sz, ll d_sum) { 44 this -> sz += d_sz, this -> sum += d_sum; 45 if (l == r) return; 46 if (pos <= mid) this -> ls = new(this -> ls)chair_tree, this -> ls -> modify(l, mid, pos, d_sz, d_sum); 47 else this -> rs = new(this -> rs)chair_tree, this -> rs -> modify(mid + 1, r, pos, d_sz, d_sum); 48 } 49 50 ll kth(int l, int r, int k) { 51 if (l == r) return 1ll * mid * min(k, this -> sz); 52 if (k <= this -> ls -> sz) return this -> ls -> kth(l, mid, k); 53 else return this -> rs -> kth(mid + 1, r, k - this -> ls -> sz) + this -> ls -> sum; 54 } 55 #undef mid 56 } *chair[N]; 57 58 struct data { 59 int t, v, del; 60 data(int _t = 0, int _v = 0, int _d = 0) : t(_t), v(_v), del(_d) {} 61 62 inline bool operator < (const data &p) const { 63 return t < p.t; 64 } 65 } a[N << 1]; 66 67 int n, m, k; 68 ll ans; 69 70 int main() { 71 int i, j, A, B, C, x, y, z; 72 m = read(), n = read(); 73 for (i = 1; i <= m; ++i) { 74 x = read(), y = read(), z = read(); 75 a[i * 2 - 1] = data(x, z, 1); 76 a[i * 2] = data(y + 1, z, -1); 77 } 78 sort(a + 1, a + m * 2 + 1); 79 chair[0] = new(0, 0)chair_tree; 80 chair[0] -> ls = chair[0] -> rs = chair[0]; 81 82 for (i = j = 1; i <= n; ++i) { 83 chair[i] = new(chair[i - 1])chair_tree; 84 for (; j <= m << 1 && a[j].t == i; ++j) 85 chair[i] -> modify(1, P, a[j].v, a[j].del, a[j].v * a[j].del); 86 } 87 for (i = ans = 1; i <= n; ++i) { 88 x = read(), A = read(), B = read(), C = read(); 89 k = (A * ans + B) % C + 1; 90 printf("%lld\n", ans = chair[x] -> kth(1, P, k)); 91 } 92 return 0; 93 } 94 95 inline int read() { 96 static int x; 97 static char ch; 98 x = 0, ch = getchar(); 99 while (ch < '0' || '9' < ch) 100 ch = getchar(); 101 while ('0' <= ch && ch <= '9') { 102 x = x * 10 + ch - '0'; 103 ch = getchar(); 104 } 105 return x; 106 }
By Xs酱~ 转载请说明
博客地址:http://www.cnblogs.com/rausen