P3374 【模板】树状数组 1
题目描述 如题,已知一个数列,你需要进行下面两种操作:
将某一个数加上 x求出某区间每一个数的和输入格式 第一行包含两个正整数 n,mn,m,分别表示该数列数字的个数和操作的总个数。 第二行包含 nn 个用空格分隔的整数,其中第 ii 个数字表示数列第 ii 项的初始值。 接下来 mm 行每行包含 33 个整数,表示一个操作,具体如下:
1 x k 含义:将第 x 个数加上 k2 x y 含义:输出区间 [x,y] 内每个数的和输出格式 输出包含若干行整数,即为所有操作 2 的结果。
输入输出样例 输入 #1 5 5 1 5 4 2 3 1 1 3 2 2 5 1 3 -1 1 4 2 2 1 4
输出 #1 14 16
#include<iostream> using namespace std; const int MAXN = 5e5+10; int a[MAXN],c[MAXN],n,m,x,y,k; int lowbit(int x) {return (x)&(-x);} void update(int x,int k){ while(x<=n){ c[x]+=k; x+=lowbit(x); } } int query(int k){ int res=0; while(k>0){ res+=c[k]; k-=lowbit(k); } return res; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; update(i,a[i]); } for(int i=0;i<m;i++){ cin>>k>>x>>y; if(k==1) update(x,y); else cout<<query(y)-query(x-1)<<endl; } return 0; }