学校OJ大数据过了1个,也试过define int long long,也试过开大数组,都不行,求调
#include<bits/stdc++.h>
using namespace std;
struct tree{
int lc,rc,cnt;
long long sum;
}t[6400001];
int n,m,q,tot,a,b,c,x,root[100001],w[100001];
long long last=1;
vector <pair<int,int> > G[200001];
int build(int l,int r){
int p=++tot,mid=(l+r)/2;
if(l==r) return p;
t[p].lc=build(l,mid);
t[p].rc=build(mid+1,r);
return p;
}
int insert(int now,int l,int r,int x,int val,int num){
int p=++tot,mid=(l+r)/2;
t[p]=t[now];
t[p].sum+=val;
t[p].cnt+=num;
if(l==r) return p;
if(x<=mid) t[p].lc=insert(t[now].lc,l,mid,x,val,num);
else t[p].rc=insert(t[now].rc,mid+1,r,x,val,num);
return p;
}
long long query(int now,int l,int r,int k){
if(l==r) return t[now].sum/t[now].cnt*min(k,t[now].cnt);
int mid=(l+r)/2;
if(k<=t[t[now].lc].cnt) return query(t[now].lc,l,mid,k);
else return t[t[now].lc].sum+query(t[now].rc,mid+1,r,k-t[t[now].lc].cnt);
}
int main(){
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
G[a].push_back({c,1});
G[b+1].push_back({-c,-1});
w[i]=c;
}
sort(w+1,w+1+m);
q=unique(w+1,w+1+m)-w-1;
root[0]=build(1,q);
for(int i=1;i<=n;i++){
root[i]=root[i-1];
for(int j=0;j<G[i].size();j++) root[i]=insert(root[i],1,q,lower_bound(w+1,w+1+q,abs(G[i][j].first))-w,G[i][j].first,G[i][j].second);
}
for(int i=1;i<=n;i++){
scanf("%d%d%d%d",&x,&a,&b,&c);
printf("%lld\n",last=query(root[x],1,q,1+(a*last+b)%c));
}
return 0;
}