记录编号 295525 评测结果 AAAAAAAAAA
题目名称 [CQOI2015]任务查询系统 最终得分 100
用户昵称 GravatarYGOI_真神名曰驴蛋蛋 是否通过 通过
代码语言 C++ 运行时间 3.934 s
提交时间 2016-08-13 20:15:47 内存使用 167.49 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <queue>
  3. typedef long long ll;
  4. typedef ll TYPE;
  5. const int MAXN=100000+10;
  6. const int MAXM=MAXN*80;
  7.  
  8. static inline int min
  9. (const int&a,const int&b)
  10. {return a<b?a:b;}
  11.  
  12. static inline int max
  13. (const int&a,const int&b)
  14. {return a<b?b:a;}
  15.  
  16. struct Node{
  17. int lc,rc,cnt;
  18. TYPE sum;
  19. // Node(){lc=rc=0;cnt=0;sum=0;}
  20. }T[MAXM];
  21.  
  22. int N,M,SIZEN=0;
  23. int root[MAXN],mark[MAXM],fate;
  24. std::vector<int>L[MAXN],R[MAXN];
  25. int V,C;
  26.  
  27. void newNode(int &y,int x)
  28. {
  29. T[y=++SIZEN]=T[x];
  30. mark[y]=fate;
  31. }
  32. void update(int l,int r,int x,int &y)
  33. {
  34. if(mark[x]!=fate)newNode(y,x);
  35. T[y].cnt+=C; T[y].sum+=V*C;
  36. if(l==r)return ; int mid=(l+r)>>1;
  37. if(V<=mid)update(l,mid,T[x].lc,T[y].lc);
  38. else update(mid+1,r,T[x].rc,T[y].rc);
  39. }
  40. TYPE query(int l,int r,int x,int rank)
  41. {
  42. if(l==r)return (TYPE)l*rank;
  43. int mid=(l+r)>>1;
  44. if(T[T[x].lc].cnt>=rank)return query(l,mid,T[x].lc,rank);
  45. else return query(mid+1,r,T[x].rc,rank-T[T[x].lc].cnt)+T[T[x].lc].sum;
  46. }
  47. int main()
  48. {
  49. freopen("cqoi15_query.in","r",stdin);
  50. freopen("cqoi15_query.out","w",stdout);
  51. int s,e,p,mn=(int)1e9,mx=(int)-1e9;
  52. scanf("%d%d",&N,&M);
  53. for(int i=1;i<=N;++i){
  54. scanf("%d%d%d",&s,&e,&p);
  55. mn=min(mn,s); mx=max(mx,e);
  56. L[s].push_back(p);
  57. R[e].push_back(p);
  58. }
  59. for(int i=mn;i<=mx;++i){
  60. newNode(root[i],root[i-1]);++fate;
  61. int sizen=L[i].size();
  62. for(int j=0;j<sizen;++j)
  63. V=L[i][j],C=1,
  64. update(1,(int)1e7,root[i],root[i]);
  65. sizen=R[i-1].size();
  66. for(int j=0;j<sizen;++j)
  67. V=R[i-1][j],C=-1,
  68. update(1,(int)1e7,root[i],root[i]);
  69. }
  70. int x;
  71. TYPE a,b,c,pre=1;
  72. for(int i=1;i<=M;++i){
  73. scanf("%d%lld%lld%lld",&x,&a,&b,&c);
  74. int k=(int)(1LL+(a*pre+b)%c);
  75. if(T[root[x]].cnt<=k)printf("%lld\n",pre=T[root[x]].sum);
  76. else printf("%lld\n",pre=query(1,(int)1e7,root[x],k));
  77. }return 0;
  78. }