题目大意见http://pan.baidu.com/s/1o6zajc2
主席树裸上就好了。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct Segtree{
Segtree *ls,*rs;
int size;
long long sum;
void* operator new (size_t,Segtree *_,Segtree *__,int ___,long long ____)
{
#define L (1<<15)
static Segtree *mempool,*C;
if(C==mempool)
mempool=(C=new Segtree[L])+L;
C->ls=_;
C->rs=__;
C->size=___;
C->sum=____;
return C++;
}
friend Segtree* Build_Tree(Segtree *p,int x,int y,int pos,int d_size,long long d_sum)
{
int mid=x+y>>1;
if(x==y)
return new (0x0,0x0,p->size+d_size,p->sum+d_sum)Segtree;
if(pos<=mid)
return new (Build_Tree(p->ls,x,mid,pos,d_size,d_sum),p->rs,p->size+d_size,p->sum+d_sum)Segtree;
else
return new (p->ls,Build_Tree(p->rs,mid+1,y,pos,d_size,d_sum),p->size+d_size,p->sum+d_sum)Segtree;
}
friend long long Query(Segtree *p,int x,int y,int k)
{
int mid=x+y>>1;
if(x==y)
return (long long)mid*min(k,p->size);
if(k<=p->ls->size)
return Query(p->ls,x,mid,k);
else
return Query(p->rs,mid+1,y,k-p->ls->size) + p->ls->sum ;
}
}*tree[M];
struct abcd{
bool flag;
int tim,val;
bool operator < (const abcd &a) const
{
return tim < a.tim ;
}
}a[M<<1];
int n,m;
long long last_ans=1;
int main()
{
int i,j,x,y,z,A,B,C;
cin>>m>>n;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
a[i+i-1].flag=true;
a[i+i-1].tim=x;
a[i+i-1].val=z;
a[i<<1].flag=false;
a[i<<1].tim=y+1;
a[i<<1].val=z;
}
sort(a+1,a+m+m+1);
tree[0]=new (0x0,0x0,0,0ll)Segtree;
tree[0]->ls=tree[0]->rs=tree[0];
for(j=1,i=1;i<=n;i++)
{
tree[i]=tree[i-1];
for(;j<=m<<1&&a[j].tim==i;j++)
tree[i]=Build_Tree(tree[i],1,10000000,a[j].val,a[j].flag?1:-1,a[j].val*(a[j].flag?1:-1));
}
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&x,&A,&B,&C);
int k=(A*last_ans+B)%C+1;
printf("%lld\n",last_ans=Query(tree[x],1,10000000,k));
}
return 0;
}