Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /******************************************************************
- * BISMILLAHIR RAHMANIR RAHIM *
- * Saddam Hossain shishir *
- * Hajee Mohammad Danesh Science & Technology University *
- * *
- ***************************************************************** */
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<map>
- #include<string>
- #include<set>
- #include<cmath>
- #include<cctype>
- #include<stack>
- #include<cstdlib>
- #include<utility>
- #include<vector>
- #include<deque>
- #include<queue>
- #include<algorithm>
- #define sc scanf
- #define si(t) scanf("%d",&t)
- #define sl(t) scanf("%I64d",&t)
- #define sii(a,b) scanf("%d%d",&a,&b)
- #define P(a) printf("%d\n",a)
- #define PLN(a) printf("%I64d ",a)
- #define pf printf
- #define gcd(a,b) __gcd(a,b)
- #define ff first
- #define ss second
- #define pr1(a) cout<<a<<endl
- #define pr2(a,b) cout<<a<<" "<<b<<endl
- #define pb push_back
- #define pii pair<int,int>
- #define pi acos(-1.0)
- #define PI 3.1415926535897932385
- #define Sin(a) sin((pi*a)/180)
- #define siz 1000001
- #define mem(ar) memset(ar,0,sizeof ar)
- #define one(x) __builtin_popcount(x)
- typedef long long ll;
- using namespace std;
- //int dx[]= {-1,-1,0,0,1,1};
- //int dy[]= {-1,0,-1,1,0,1};
- //int dx[]= {0,0,1,-1};/*4 side move*/
- //int dy[]= {-1,1,0,0};/*4 side move*/
- //int dx[]= {1,1,0,-1,-1,-1,0,1};/*8 side move*/
- //int dy[]= {0,1,1,1,0,-1,-1,-1};/*8 side move*/
- //int dx[]={1,1,2,2,-1,-1,-2,-2};/*knight move*/
- //int dy[]={2,-2,1,-1,2,-2,1,-1};/*knight move*/
- map<ll,bool>visi;
- struct info
- {
- ll prop,sum;
- } tree[3*siz],tree2[3*siz];
- void update(ll node,ll b,ll e,ll i,ll j,ll x)
- {
- ll Left,Right,mid;
- if (i > e || j < b) return;
- if (b >= i && e <= j)
- {
- tree[node].sum+=((e-b+1)*x);
- tree[node].prop+=x;
- return;
- }
- Left=node*2;
- Right=(node*2)+1;
- mid=(b+e)/2;
- update(Left,b,mid,i,j,x);
- update(Right,mid+1,e,i,j,x);
- tree[node].sum=tree[Left].sum+tree[Right].sum+(e-b+1)*tree[node].prop;
- }
- void update2(ll node,ll b,ll e,ll i,ll j,ll x)
- {
- ll Left,Right,mid;
- if (i > e || j < b) return;
- if (b >= i && e <= j)
- {
- ll rem=e-b+1;
- ll sum=(rem*(2*b+rem-1))/2;
- sum=sum*x;
- tree2[node].sum+=sum;
- tree2[node].prop+=x;
- return;
- }
- Left=node*2;
- Right=(node*2)+1;
- mid=(b+e)/2;
- update2(Left,b,mid,i,j,x);
- update2(Right,mid+1,e,i,j,x);
- ll rem=e-b+1;
- ll sum=(rem*(2*b+rem-1))/2;
- tree2[node].sum=tree2[Left].sum+tree2[Right].sum+sum*tree2[node].prop;
- }
- ll query2(ll node,ll b,ll e,ll i,ll j,ll carry=0)
- {
- ll Left,Right,mid,p1,p2;
- if (i > e || j < b) return 0;
- if(b>=i && e<=j)
- return tree[node].sum+carry*(e-b+1);
- Left=node<<1;
- Right=(node<<1)+1;
- mid=(b+e)>>1;
- p1 = query2(Left, b,mid, i, j, carry+tree[node].prop);
- p2 = query2(Right, mid+1, e, i, j,carry+tree[node].prop);
- return p1+p2;
- }
- ll query3(ll node,ll b,ll e,ll i,ll j,ll carry=0)
- {
- ll Left,Right,mid,p1,p2;
- if (i > e || j < b) return 0;
- if(b>=i && e<=j)
- {
- ll rem=e-b+1;
- ll sum=(rem*(2*b+rem-1))/2;
- sum=sum*carry;
- return tree2[node].sum+sum;
- }
- Left=node<<1;
- Right=(node<<1)+1;
- mid=(b+e)>>1;
- p1 = query3(Left, b,mid, i, j, carry+tree2[node].prop);
- p2 = query3(Right, mid+1, e, i, j,carry+tree2[node].prop);
- return p1+p2;
- }
- int main()
- {
- //freopen("input.txt","r",stdin);
- //freopen("output.txt","w",stdout);
- ll i,j,n,m,a,c,b,d,ck,t,r,x,y,ans,ans2,rem,cnt,lo,hi,sum,cs=1;
- char str[100];
- scanf("%lld",&t);
- while(t--)
- {
- printf("Case %lld:\n",cs++);
- scanf("%lld %lld",&n,&m);
- for(i=0; i<=3*n; i++)
- {
- tree[i].sum=tree2[i].sum=0;
- tree[i].prop=tree2[i].prop=0;
- }
- for(i=1; i<=n; i++)
- {
- update(1,1,n,i,i,100);
- update2(1,1,n,i,i,100);
- }
- while(m--)
- {
- scanf("%s",str);
- if(str[0]=='q')
- {
- scanf("%lld%lld",&x,&y);
- ans=query3(1,1,n,x,y);
- ans2=query2(1,1,n,x,y);
- // cout<<ans<<" ans "<<ans2<<endl;
- ans=ans-ans2*(x-1);
- printf("%lld\n",ans);
- }
- else
- {
- scanf("%lld%lld%lld",&x,&y,&c);
- update(1,1,n,x,y,c);
- update2(1,1,n,x,y,c);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement