记录编号 |
295525 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[CQOI2015]任务查询系统 |
最终得分 |
100 |
用户昵称 |
YGOI_真神名曰驴蛋蛋 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
3.934 s |
提交时间 |
2016-08-13 20:15:47 |
内存使用 |
167.49 MiB |
显示代码纯文本
- #include <cstdio>
- #include <queue>
- typedef long long ll;
- typedef ll TYPE;
- const int MAXN=100000+10;
- const int MAXM=MAXN*80;
-
- static inline int min
- (const int&a,const int&b)
- {return a<b?a:b;}
-
- static inline int max
- (const int&a,const int&b)
- {return a<b?b:a;}
-
- struct Node{
- int lc,rc,cnt;
- TYPE sum;
- // Node(){lc=rc=0;cnt=0;sum=0;}
- }T[MAXM];
-
- int N,M,SIZEN=0;
- int root[MAXN],mark[MAXM],fate;
- std::vector<int>L[MAXN],R[MAXN];
- int V,C;
-
- void newNode(int &y,int x)
- {
- T[y=++SIZEN]=T[x];
- mark[y]=fate;
- }
- void update(int l,int r,int x,int &y)
- {
- if(mark[x]!=fate)newNode(y,x);
- T[y].cnt+=C; T[y].sum+=V*C;
- if(l==r)return ; int mid=(l+r)>>1;
- if(V<=mid)update(l,mid,T[x].lc,T[y].lc);
- else update(mid+1,r,T[x].rc,T[y].rc);
- }
- TYPE query(int l,int r,int x,int rank)
- {
- if(l==r)return (TYPE)l*rank;
- int mid=(l+r)>>1;
- if(T[T[x].lc].cnt>=rank)return query(l,mid,T[x].lc,rank);
- else return query(mid+1,r,T[x].rc,rank-T[T[x].lc].cnt)+T[T[x].lc].sum;
- }
- int main()
- {
- freopen("cqoi15_query.in","r",stdin);
- freopen("cqoi15_query.out","w",stdout);
- int s,e,p,mn=(int)1e9,mx=(int)-1e9;
- scanf("%d%d",&N,&M);
- for(int i=1;i<=N;++i){
- scanf("%d%d%d",&s,&e,&p);
- mn=min(mn,s); mx=max(mx,e);
- L[s].push_back(p);
- R[e].push_back(p);
- }
- for(int i=mn;i<=mx;++i){
- newNode(root[i],root[i-1]);++fate;
- int sizen=L[i].size();
- for(int j=0;j<sizen;++j)
- V=L[i][j],C=1,
- update(1,(int)1e7,root[i],root[i]);
- sizen=R[i-1].size();
- for(int j=0;j<sizen;++j)
- V=R[i-1][j],C=-1,
- update(1,(int)1e7,root[i],root[i]);
- }
- int x;
- TYPE a,b,c,pre=1;
- for(int i=1;i<=M;++i){
- scanf("%d%lld%lld%lld",&x,&a,&b,&c);
- int k=(int)(1LL+(a*pre+b)%c);
- if(T[root[x]].cnt<=k)printf("%lld\n",pre=T[root[x]].sum);
- else printf("%lld\n",pre=query(1,(int)1e7,root[x],k));
- }return 0;
- }