Tuesday, June 28, 2016

SPOJ/LightOJ 1164 Horrible Queries

#include <bits/stdc++.h>
#define LL  long long
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<n;i++)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REV(i,n) for(int i=n-1;i>=0;i--)
#define pri(a) cout << a << endl;
using namespace std;

#define sz 100007
LL a[sz], tr[sz*4], prop[sz*4];

void update(int node, int b, int e, int i, int j, LL val)
{
    if(b>=i and e<=j)
    {
        tr[node] += (e-b+1)*val;
        prop[node] += val;
        return;
    }
    int mid=(b+e)>>1;
    int lft=node<<1 ,rgt=lft+1;

    if(j<=mid) update(lft,b,mid,i,j,val);
    else if(i>mid) update(rgt,mid+1,e,i,j,val);
    else
    {
        update(lft,b,mid,i,j,val);
        update(rgt,mid+1,e,i,j,val);
    }
    tr[node] = tr[lft] + tr[rgt] + prop[node]*(e-b+1);
}

LL query(int node, int b, int e, int i, int j, LL car)
{
    if(b>=i and e<=j)
    {
        return tr[node]+car*(e-b+1);
    }
    int mid = (b+e)>>1;
    int lft = node<<1, rgt = lft+1;

    if(j<=mid) query(lft,b,mid,i,j,car+prop[node]);
    else if(i>mid) query(rgt,mid+1,e,i,j,car+prop[node]);
    else
    {
        return (query(lft,b,mid,i,j,car+prop[node]) + query(rgt,mid+1,e,i,j,car+prop[node]));
    }
}

int main()
{
   // freopen("F:\out.txt", "w", stdout);
    int n,qu,T,op,p,q,v,cs=0;
    scanf("%d",&T);
    while(T--)
    {
        memset(tr, 0, sizeof tr);
        memset(prop, 0, sizeof prop);
       // printf("Case %d:\n",++cs);
        scanf("%d%d",&n,&qu);
        REP(i,qu)
        {
            scanf("%d", &op);

            if(op==0)
            {
                scanf("%d%d%d",&p,&q,&v);
                p--,q--;
                update(1,0,n-1,p,q,v);
            }
            else if(op==1)
            {
                scanf("%d%d",&p,&q);
                p--,q--;
                LL res = query(1,0,n-1,p,q,0);
                printf("%lld\n", res);
            }
        }
    }

    return 0;
}

No comments:

Post a Comment