Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Utkarsh.25dec
- #include <bits/stdc++.h>
- #include <chrono>
- #include <random>
- #define ll long long int
- #define ull unsigned long long int
- #define pb push_back
- #define mp make_pair
- #define mod 1000000007
- #define rep(i,n) for(ll i=0;i<n;i++)
- #define loop(i,a,b) for(ll i=a;i<=b;i++)
- #define vi vector <int>
- #define vs vector <string>
- #define vc vector <char>
- #define vl vector <ll>
- #define all(c) (c).begin(),(c).end()
- #define max3(a,b,c) max(max(a,b),c)
- #define min3(a,b,c) min(min(a,b),c)
- #define deb(x) cerr<<#x<<' '<<'='<<' '<<x<<'\n'
- using namespace std;
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
- // ordered_set s ; s.order_of_key(val) no. of elements strictly less than val
- // s.find_by_order(i) itertor to ith element (0 indexed)
- typedef vector<vector<ll>> matrix;
- ll power(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
- ll modInverse(ll a){return power(a,mod-2);}
- const int N=100023;
- bool vis[N];
- vector <int> adj[N];
- // This is code for adding polynomial to segment tree
- // zero refers to x^3 and three refers to const
- ll zero[N],one[N],two[N],three[N];
- ll lazy[4*N][4];
- ll mytree[4*N];
- tuple <ll,ll,ll,ll> get_coefficients(ll l,int sign)
- {
- tuple <ll,ll,ll,ll> ans;
- get<0>(ans)=1;
- ll temp=(6-3*l)%mod;
- temp=(temp+mod)%mod;
- get<1>(ans)=temp;
- temp=(2-l)*(3-l)+(1-l)*(3-l)+(1-l)*(2-l);
- temp%=mod;
- temp=(temp+mod)%mod;
- get<2>(ans)=temp;
- temp=(1-l)*(2-l)*(3-l);
- temp%=mod;
- temp=(temp+mod)%mod;
- get<3>(ans)=temp;
- get<0>(ans)=(get<0>(ans)*sign);
- get<0>(ans)=(get<0>(ans)+mod)%mod;
- get<1>(ans)=(get<1>(ans)*sign);
- get<1>(ans)=(get<1>(ans)+mod)%mod;
- get<2>(ans)=(get<2>(ans)*sign);
- get<2>(ans)=(get<2>(ans)+mod)%mod;
- get<3>(ans)=(get<3>(ans)*sign);
- get<3>(ans)=(get<3>(ans)+mod)%mod;
- return ans;
- }
- ll get_sum(tuple <ll,ll,ll,ll> coeff,ll l,ll r)
- {
- ll a,b,c,d;
- tie(a,b,c,d)=coeff;
- ll ans=d*(three[r]-three[l-1])+c*(two[r]-two[l-1])+b*(one[r]-one[l-1])+a*(zero[r]-zero[l-1]);
- ans%=mod;
- ans+=mod;
- ans%=mod;
- return ans;
- }
- void push(int v,int tl,int tr)
- {
- mytree[v]+=(get_sum({lazy[v][0],lazy[v][1],lazy[v][2],lazy[v][3]},tl,tr));
- mytree[v]%=mod;
- for(int i=0;i<4;i++)
- {
- if(tl!=tr)
- {
- lazy[2*v][i]+=lazy[v][i];
- lazy[2*v][i]%=mod;
- lazy[2*v+1][i]+=lazy[v][i];
- lazy[2*v+1][i]%=mod;
- }
- lazy[v][i]=0;
- }
- }
- void update(int v,int tl,int tr,int l,int r,tuple <ll,ll,ll,ll> add)
- {
- if(tl>tr)
- return;
- push(v,tl,tr);
- if(tl>r || tr<l)
- return;
- if(tl>=l && tr<=r)
- {
- lazy[v][0]=get<0>(add);
- lazy[v][1]=get<1>(add);
- lazy[v][2]=get<2>(add);
- lazy[v][3]=get<3>(add);
- push(v,tl,tr);
- return;
- }
- int mid=(tl+tr)/2;
- update(2*v,tl,mid,l,r,add);
- update(2*v+1,mid+1,tr,l,r,add);
- mytree[v]=(mytree[2*v]+mytree[2*v+1])%mod;
- }
- ll query(int v,int tl,int tr,int l,int r)
- {
- if(tl>tr)
- return 0;
- push(v,tl,tr);
- if(tl>r || tr<l)
- return 0;
- if(tl>=l && tr<=r)
- {
- return mytree[v];
- }
- int mid=(tl+tr)/2;
- return (query(2*v,tl,mid,l,r)+query(2*v+1,mid+1,tr,l,r))%mod;
- }
- void solve()
- {
- ll n,q;
- cin>>n>>q;
- for(int i=1;i<=n;i++)
- {
- zero[i]=zero[i-1]+((ll)i*i*i);
- one[i]=one[i-1]+((ll)i*i);
- two[i]=two[i-1]+((ll)i);
- three[i]=three[i-1]+1;
- zero[i]%=mod;
- one[i]%=mod;
- two[i]%=mod;
- three[i]%=mod;
- }
- for(int _=1;_<=q;_++)
- {
- int t,x,y;
- cin>>t>>x>>y;
- if(t==0)
- {
- cout<<query(1,1,n,x,y)<<'\n';
- }
- else
- {
- int sign=1;
- if(t==2)
- sign=-1;
- auto add=get_coefficients(x,sign);
- update(1,1,n,x,y,add);
- }
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- int T=1;
- //cin>>T;
- int t=0;
- while(t++<T)
- {
- //cout<<"Case #"<<t<<":"<<' ';
- solve();
- //cout<<'\n';
- }
- cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
- }
Add Comment
Please, Sign In to add comment