这个主席树也太裸了吧。
操作是两倍所以蜜汁RE
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<vector>
#define LL long long
#define maxn 100005
#define maxnum 10000007
#define Maxsiz maxn * 30 * 2//!!
using namespace std;
int n,m;
int siz[Maxsiz],lc[Maxsiz],rc[Maxsiz],rt[maxn],cnt_p;
LL sum[Maxsiz];
void Modify(int &now,int l,int r,int pos,int val)
{
int tmp=now;
now=++cnt_p;
lc[now]=lc[tmp],rc[now]=rc[tmp],siz[now]=siz[tmp]+(val>0?1:-1),sum[now]=sum[tmp]+val;
if(l==r) return;
int mid=(l+r)>>1;
if(pos<=mid) Modify(lc[now],l,mid,pos,val);
else Modify(rc[now],mid+1,r,pos,val);
}
vector<int>vec[maxn];
LL Query(int now,int l,int r,int rk)
{
if(l==r) return siz[now] ? sum[now] / siz[now] * rk : 0;
int mid=(l+r)>>1;
if(siz[lc[now]] == rk) return sum[lc[now]];
else if(siz[lc[now]]>rk) return Query(lc[now],l,mid,rk);
else return sum[lc[now]] + Query(rc[now],mid+1,r,rk-siz[lc[now]]);
}
int main()
{
int u,v,w;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
vec[u].push_back(w);
vec[v+1].push_back(-w);
}
for(int i=1;i<=n;i++)
{
rt[i]=rt[i-1];
for(int j=0,siz=vec[i].size();j<siz;j++)
Modify(rt[i],1,maxnum,abs(vec[i][j]),vec[i][j]);
}
LL Pre=1;
for(int i=1,x,k;i<=n;i++)
{
scanf("%d%d%d%d",&x,&u,&v,&w);
k=1+(1ll * u * (Pre % w) + v) % w;
printf("%lld\n",Pre=Query(rt[x],1,maxnum,k));
}
}