UOJ Logo heqingyu的博客

博客

洛谷P3374 题解

2017-10-12 12:49:32 By heqingyu

神奇的树状数组,写三个函数过了,这些函数理解也很容易,也可以选择背下来。。

但是,要提醒的是,cin最好全部换成scanf,然后还有RE的。。。

我自己就RE了数回,原因很鬼畜。。

1、不要把数组开太小。。

2、solve函数会把头元素x算进去,所以是solve(x-1)。。。

3、附上代码:

include

using namespace std;

int n,m,x,y,c[500010],a[500010],ch;

int lowbit(int x){

return x&(-x);

} void change(int x,int y){

while(x<=n){

    c[x]+=y;

    x+=lowbit(x);

}

}

int solve(int x){

int cnt=0;

while(x){

    cnt+=c[x];

    //cout<<c[x]<<endl;

    x-=lowbit(x);

}

return cnt;

}

int main(){

scanf("%d%d",&n,&m);

for(int i=1;i<=n;i++)scanf("%d",&a[i]),change(i,a[i]);

for(int i=1;i<=m;i++){ 

    scanf("%d%d%d",&ch,&x,&y);

    if(ch==1) change(x,y);

    else{

    printf("%d",solve(y)-solve(x-1));

    if(i!=m) puts("");

    }

}

return 0;

}

评论

暂无评论