【模板】树状数组

本来考试准备愉快的打树状数组,结果不记得了,哈哈哈

树状数组区间更新、查询模板

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define lowbit(x) ((x)&-(x))
using namespace std;
int c[500010],x,y,z,n,m;
void update(int x,int k)
{
    for(int i=x;i<=n;i+=lowbit(i))
       c[i]+=k;
}
int sum(int x)
{
    int ans=0;
    for(int i=x;i>0;i-=lowbit(i))
       ans+=c[i];
    return ans;
}
int main()
{
    int k,pass=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(i,x-pass);
        pass=x;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&z);
        if(z==1)
        {
            scanf("%d%d%d",&x,&y,&k);
        //    for(int j=x;j<=y;j++)
        //    update(j,k);
            update(x,k);
            update(y+1,-k);
            continue;
        }
        scanf("%d",&x);
        cout<<sum(x)<<endl;
        
    }
    return 0;
}
View Code

 

posted @ 2016-11-16 15:07  Native_carrot  阅读(109)  评论(0编辑  收藏  举报