码迷,mamicode.com
首页 > 编程语言 > 详细

POJ3468(树状数组区间维护)

时间:2015-11-22 15:59:54      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

模板题

#include"cstdio"
#include"cstring"
#define lowbit(i) i&(-i)
using namespace std;
const int MAXN=100005;
typedef long long LL;
LL bit0[MAXN];
LL bit1[MAXN];
void add(LL* b,int i,int c)
{
    while(i<=MAXN)
    {
        b[i]+=c;
        i+=lowbit(i);
    }
}
LL sum(LL* b,int i)
{
    LL s=0;
    while(i>0)
    {
        s+=b[i];
        i-=lowbit(i);
    }
    return s;
}
void solve(int n,int q)
{
    for(int i=1;i<=n;i++)
    {
        int a;
        scanf("%d",&a);
        add(bit0,i,a);
    }
    for(int j=0;j<q;j++)
    {
        scanf("%*c");
        char op;
        scanf("%c",&op);
        if(op==C)
        {
            int l,r,x;
            scanf("%d %d %d",&l,&r,&x);
            add(bit0,l,-x*(l-1));
            add(bit1,l,x);
            add(bit0,r+1,x*r);
            add(bit1,r+1,-x);
        }
        else
        {
            LL res=0;
            int l,r;
            scanf("%d %d",&l,&r);
            res+=sum(bit0,r)+sum(bit1,r)*r;
            res-=sum(bit0,l-1)+sum(bit1,l-1)*(l-1);
            printf("%lld\n",res);
        }
    }
}
int main()
{
    int n,q;
    while(scanf("%d %d",&n,&q)!=EOF)
    {
        memset(bit0,0,sizeof(bit0));
        memset(bit1,0,sizeof(bit1));
        solve(n,q);
    }
    return 0;
}

 

POJ3468(树状数组区间维护)

标签:

原文地址:http://www.cnblogs.com/program-ccc/p/4985878.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!