树状数组

    科技2024-10-13  18

    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; }
    Processed: 0.022, SQL: 8