poj_3468线段树成段更新求区间和

来源:互联网 发布:周星驰喜欢林允吗 知乎 编辑:程序博客网 时间:2024/06/05 04:43
#include<iostream>#include<string.h>#include<cstdio>long long num[100010];using namespace std;struct st{    int l;    int r;    long long  sum;    long long a;} p[400100];void build(int t,int l,int r){    p[t].l=l;    p[t].r=r;    if(l==r-1)    {        p[t].sum=num[l];        return;    }    int mid=(l+r)/2;    build(t*2+1,mid,r);    build(t*2,l,mid);    p[t].sum=p[t*2].sum+p[t*2+1].sum;}void update(int t,int l,int r,int v){    if(p[t].l==l&&p[t].r==r)    {        p[t].a += v;p[t].sum += v*(r -l);return ;    }    if( p[t].a ){p[2*t+1].a += p[t].a;p[2*t].a += p[t].a;p[2*t+1].sum += p[t].a*(p[2*t+1].r -p[2*t+1].l);p[2*t].sum += p[t].a*(p[2*t].r -p[2*t].l);p[t].a = 0;}int mid = (p[t].l+p[t].r)/2;if( l >= mid )update(2*t+1,l,r,v);elseif( r <= mid )update(2*t,l,r,v);else{update(2*t,l,mid,v);update(2*t+1,mid,r,v);}p[t].sum = p[2*t].sum + p[2*t+1].sum;}long long query(int t,int l,int r){if(p[t].l == l && p[t].r == r )return p[t].sum;if( p[t].a ){p[2*t+1].a += p[t].a;p[2*t].a += p[t].a;p[2*t+1].sum +=p[t].a*(p[2*t+1].r - p[2*t+1].l);p[2*t].sum += p[t].a*(p[2*t].r - p[2*t].l);p[t].a = 0;}int mid =(p[t].l+p[t].r)/2;if( l >= mid )return query(2*t+1,l,r);elseif( r <= mid )return query(2*t,l,r);elsereturn query(2*t,l,mid) + query(2*t+1,mid,r);}int main(){    int n,q;    while(scanf("%d%d",&n,&q)!=EOF)    {        for(int i=0; i<n; i++)            scanf("%lld",&num[i]);        memset(p,0,sizeof(p));        build(1,0,n+1);        getchar();        for(int i=0; i<q; i++)        {            char c;            scanf("%c",&c);            if(c=='Q')            {                int x,y;                scanf("%d%d",&x,&y);                getchar();                printf("%lld\n",query(1,x-1,y));            }            else if(c=='C')            {                int x,y,z;                scanf("%d%d%d",&x,&y,&z);                getchar();                update(1,x-1,y,z);            }        }    }    return 0;}

0 0
原创粉丝点击