Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //...
- #include <bits/stdc++.h>
- #define Pi 3.14159265358
- #define mod9 %1000000009
- #define mod7 %1000000007
- #define INF 1000000000+7574
- #define LL long long
- using namespace std;
- struct name{
- LL x; //pirveli elementi
- LL y; //nazrdi
- LL z; //nazrdis nazrdi
- LL cnt;
- LL val;
- } T[8000001],p;
- LL i,j,n,q,x,y,op;
- LL f(LL A,LL B,LL C,LL D){
- LL out=(A*D+D*(D-1)/2 mod7 *B) mod7;
- LL r1,r2,r3;
- r1=D;
- r2=(D+1);
- r3=2*D-8;
- if (r1%2==0) r1/=2; else if (r2%2==0) r2/=2; else r3/=2;
- if (r1%2==0) r1/=2; else if (r2%2==0) r2/=2; else r3/=2;
- if (r1%3==0) r1/=3; else if (r2%3==0) r2/=3; else r3/=3;
- LL e=(r1*r2 mod7 *r3+D) mod7;
- out=(out+e*C mod7) mod7;
- //cout<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<out<<endl;
- return out;
- }
- void push(int v){
- if (T[v].z==0) return;
- T[2*v].x=(T[2*v].x+T[v].x) mod7;
- T[2*v].y=(T[2*v].y+T[v].y) mod7;
- T[2*v].z=(T[2*v].z+T[v].z) mod7;
- T[2*v].val=(T[2*v].val+f(T[v].x,T[v].y,T[v].z,T[2*v].cnt)) mod7;
- 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;
- T[2*v+1].y=(T[2*v+1].y+T[v].y+T[v].z*T[2*v].cnt) mod7;
- T[2*v+1].z=(T[2*v+1].z+T[v].z) mod7;
- 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;
- T[v].x=T[v].y=0;
- T[v].z=0;
- }
- void Build(int v,int tl,int tr){
- if (tl==tr)
- {
- T[v].cnt=1;
- return;
- }
- int tm=(tl+tr)/2;
- Build(2*v,tl,tm);
- Build(2*v+1,tm+1,tr);
- T[v].cnt=T[2*v].cnt+T[2*v+1].cnt;
- }
- void update(int v,int tl,int tr,int l,int r){
- if (l>r) return;
- if (tl==l && tr==r)
- {
- T[v].x=(T[v].x+(l-x+1)*(l-x+2)/2)mod7;
- T[v].y=(T[v].y+l-x+2)mod7;
- T[v].z=(T[v].z+1) mod7;
- T[v].val+=f((l-x+1)*(l-x+2)/2 mod7,(l-x+2)mod7,1,T[v].cnt);
- return;
- }
- int tm=(tl+tr)/2;
- push(v);
- update(2*v,tl,tm,l,min(tm,r));
- update(2*v+1,tm+1,tr,max(tm+1,l),r);
- T[v].val=(T[2*v].val+T[2*v+1].val) mod7;
- }
- LL query(int v,int tl,int tr,int l,int r){
- if (l>r) return 0LL;
- if (tl==l && tr==r) return T[v].val;
- push(v);
- int tm=(tl+tr)/2;
- return (query(2*v,tl,tm,l,min(tm,r))+query(2*v+1,tm+1,tr,max(tm+1,l),r))mod7;
- }
- int main(){
- cin>>n>>q;
- Build(1,1,n);
- while (q--){
- cin>>op>>x>>y;
- if (op==1)
- update(1,1,n,x,y);
- else
- cout<<2*query(1,1,n,x,y) mod7<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement