1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| #include<algorithm> #include<iostream> #include<iomanip> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<cmath> #include<ctime> #include<queue> using namespace std;
inline const int Get_Int() { int num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj; }
#define pii pair<int,int> #define mp make_pair typedef long long LL; mt19937 g(rand());
const int maxn=100005;
struct Tree { int l,r,size; int val; LL sum; Tree() {} Tree(int _l,int _r,int s,int v,LL _s):l(_l),r(_r),size(s),val(v),sum(_s) {} };
struct Treap { Tree tree[maxn*110]; int size; #define val(x) tree[x].val #define size(x) tree[x].size int newnode(int v) { tree[++size]=Tree(0,0,1,v,v); return size; } void push_up(int index) { int l=tree[index].l,r=tree[index].r; size(index)=size(l)+size(r)+1; tree[index].sum=tree[l].sum+val(index)+tree[r].sum; } pii split(int index,int num) { if(!index)return mp(0,0); int l=tree[index].l,r=tree[index].r; int now=++size; tree[now]=tree[index]; if(num<=size(l)) { pii lt=split(l,num); tree[now].l=lt.second; push_up(now); return mp(lt.first,now); } else { pii rt=split(r,num-size(l)-1); tree[now].r=rt.first; push_up(now); return mp(now,rt.second); } } int merge(int a,int b) { if(!a||!b)return a+b; int now=++size; if(g()%(size(a)+size(b))<size(a)) { tree[now]=tree[a]; tree[now].r=merge(tree[a].r,b); } else { tree[now]=tree[b]; tree[now].l=merge(a,tree[b].l); } push_up(now); return now; } int get_rank(int index,int v) { if(!index)return 0; if(v<val(index))return get_rank(tree[index].l,v); else return size(tree[index].l)+1+get_rank(tree[index].r,v); } int insert(int index,int v) { int k=get_rank(index,v); pii tmp=split(index,k); return merge(merge(tmp.first,newnode(v)),tmp.second); } int remove(int index,int v) { int k=get_rank(index,v); return merge(split(index,k-1).first,split(index,k).second); } LL query(int index,int k) { if(!index||!k)return 0; if(k<=size(tree[index].l))return query(tree[index].l,k); else return tree[tree[index].l].sum+tree[index].val+query(tree[index].r,k-size(tree[index].l)-1); } } bbt;
int n,q,root[maxn]; LL lastans=1; vector<pii>a[maxn];
int main() { srand(time(NULL)); n=Get_Int(); q=Get_Int(); for(int i=1; i<=n; i++) { int l=Get_Int(),r=Get_Int(),v=Get_Int(); a[l].push_back(mp(1,v)); a[r+1].push_back(mp(-1,v)); } for(int i=1; i<=q; i++) { root[i]=root[i-1]; for(pii tmp:a[i]) { int opt=tmp.first,v=tmp.second; if(opt==1)root[i]=bbt.insert(root[i],v); else root[i]=bbt.remove(root[i],v); } } while(q--) { int x=Get_Int(),a=Get_Int(),b=Get_Int(),c=Get_Int(); int k=1+(lastans*a+b)%c; if(k>=bbt.tree[root[x]].size)lastans=bbt.tree[root[x]].sum; else lastans=bbt.query(root[x],k); printf("%lld\n",lastans); } return 0; }
|