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
|
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,x,y) for(register int i=x;i<=y;++i) #define repd(i,x,y) for(register int i=x;i>=y;--i) #define ll long long using namespace std; const int N=2e5+7; struct { int l,val,p; node(int l,int val,int p):l(l),val(val),p(p){} node(){} }e[N<<2]; ll tr[N<<5],size[N<<5]; int lson[N<<5],rson[N<<5],root[N],a[N],len,n,m,cnt; inline int cmpv(node x,node y){return x.val<y.val;} inline int cmpt(node x,node y){return x.l<y.l;} inline void update(int &o,int l,int r,int k,int p){ lson[++cnt]=lson[o];rson[cnt]=rson[o];tr[cnt]=tr[o];size[cnt]=size[o]; o=cnt;tr[o]+=a[k]*p;size[o]+=p; if(l==r)return; int mid=l+r>>1; if(k<=mid)update(lson[o],l,mid,k,p); else update(rson[o],mid+1,r,k,p); } inline ll query(int o,int l,int r,int k){ if(size[o]<=k)return tr[o]; if(l==r)return tr[o]/size[o]*k; int mid=l+r>>1; if(k<=size[lson[o]])return query(lson[o],l,mid,k); return tr[lson[o]]+query(rson[o],mid+1,r,k-size[lson[o]]); } inline void solve(){ scanf("%d%d",&n,&m); rep(i,1,n){ int a,b,c; scanf("%d%d%d",&a,&b,&c); e[(i<<1)-1]=node(a,c,1);e[i<<1]=node(b+1,c,-1); } sort(e+1,e+n*2+1,cmpv); rep(i,1,n*2){if(e[i].val!=a[len])a[++len]=e[i].val;e[i].val=len;} sort(e+1,e+n*2+1,cmpt); ll pre=1;int k=1; rep(i,1,m){ root[i]=root[i-1]; while(e[k].l==i)update(root[i],1,len,e[k].val,e[k].p),k++; } rep(i,1,m){ int x,A,B,c; scanf("%d%d%d%d",&x,&A,&B,&c); pre=(pre*A+B)%c+1; printf("%lldn",pre=query(root[x],1,len,pre)); } } int main(){ solve(); return 0; }
|
近期评论