Advertisement
Guest User

Untitled

a guest
Jun 21st, 2015
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.55 KB | None | 0 0
  1. //...
  2. #include <bits/stdc++.h>
  3. #define Pi 3.14159265358
  4. #define mod9 %1000000009
  5. #define mod7 %1000000007
  6. #define INF 1000000000+7574
  7. #define LL long long
  8. using namespace std;
  9. struct name{
  10. LL x; //pirveli elementi
  11. LL y; //nazrdi
  12. LL z; //nazrdis nazrdi
  13.  
  14. LL cnt;
  15. LL val;
  16. } T[8000001],p;
  17. LL i,j,n,q,x,y,op;
  18. LL f(LL A,LL B,LL C,LL D){
  19. LL out=(A*D+D*(D-1)/2 mod7 *B) mod7;
  20. LL r1,r2,r3;
  21. r1=D;
  22. r2=(D+1);
  23. r3=2*D-8;
  24. if (r1%2==0) r1/=2; else if (r2%2==0) r2/=2; else r3/=2;
  25. if (r1%2==0) r1/=2; else if (r2%2==0) r2/=2; else r3/=2;
  26. if (r1%3==0) r1/=3; else if (r2%3==0) r2/=3; else r3/=3;
  27.  
  28. LL e=(r1*r2 mod7 *r3+D) mod7;
  29. out=(out+e*C mod7) mod7;
  30. //cout<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<out<<endl;
  31. return out;
  32. }
  33. void push(int v){
  34. if (T[v].z==0) return;
  35. T[2*v].x=(T[2*v].x+T[v].x) mod7;
  36. T[2*v].y=(T[2*v].y+T[v].y) mod7;
  37. T[2*v].z=(T[2*v].z+T[v].z) mod7;
  38. T[2*v].val=(T[2*v].val+f(T[v].x,T[v].y,T[v].z,T[2*v].cnt)) mod7;
  39.  
  40. T[2*v+1].x=(T[2*v+1].x+T[v].x+T[v].y*T[2*v].cnt+((T[2*v].cnt-1)*T[2*v].cnt/2 mod7 )*T[v].z) mod7;
  41. T[2*v+1].y=(T[2*v+1].y+T[v].y+T[v].z*T[2*v].cnt) mod7;
  42. T[2*v+1].z=(T[2*v+1].z+T[v].z) mod7;
  43. T[2*v+1].val=(T[2*v+1].val+f(T[v].x+T[v].y*T[2*v].cnt+(T[2*v].cnt-1)*T[2*v].cnt/2*T[v].z,T[v].y+T[v].z*T[2*v].cnt,T[v].z,T[2*v+1].cnt)) mod7;
  44.  
  45. T[v].x=T[v].y=0;
  46. T[v].z=0;
  47. }
  48.  
  49. void Build(int v,int tl,int tr){
  50. if (tl==tr)
  51. {
  52. T[v].cnt=1;
  53. return;
  54. }
  55. int tm=(tl+tr)/2;
  56. Build(2*v,tl,tm);
  57. Build(2*v+1,tm+1,tr);
  58. T[v].cnt=T[2*v].cnt+T[2*v+1].cnt;
  59. }
  60. void update(int v,int tl,int tr,int l,int r){
  61. if (l>r) return;
  62. if (tl==l && tr==r)
  63. {
  64. T[v].x=(T[v].x+(l-x+1)*(l-x+2)/2)mod7;
  65. T[v].y=(T[v].y+l-x+2)mod7;
  66. T[v].z=(T[v].z+1) mod7;
  67. T[v].val+=f((l-x+1)*(l-x+2)/2 mod7,(l-x+2)mod7,1,T[v].cnt);
  68. return;
  69. }
  70. int tm=(tl+tr)/2;
  71. push(v);
  72. update(2*v,tl,tm,l,min(tm,r));
  73. update(2*v+1,tm+1,tr,max(tm+1,l),r);
  74. T[v].val=(T[2*v].val+T[2*v+1].val) mod7;
  75. }
  76. LL query(int v,int tl,int tr,int l,int r){
  77. if (l>r) return 0LL;
  78. if (tl==l && tr==r) return T[v].val;
  79. push(v);
  80. int tm=(tl+tr)/2;
  81. return (query(2*v,tl,tm,l,min(tm,r))+query(2*v+1,tm+1,tr,max(tm+1,l),r))mod7;
  82. }
  83. int main(){
  84.  
  85. cin>>n>>q;
  86. Build(1,1,n);
  87. while (q--){
  88. cin>>op>>x>>y;
  89. if (op==1)
  90. update(1,1,n,x,y);
  91. else
  92. cout<<2*query(1,1,n,x,y) mod7<<endl;
  93. }
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement