模板一(单点操作):

#include<bits/stdc++.h>

using namespace std;

const int N=5e5+5;

int n,m;
int a[N];
int c[N];

void add(int x,int y) {
    for(; x<=n; x+=x&-x) c[x]+=y;
}

int ask(int x) {
    int ans=0;
    for(; x; x-=x&-x) ans+=c[x];
    return ans;
}

int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
        add(i,a[i]);
    }
    for(int i=1; i<=m; i++) {
        int op,x,y;
        scanf("%d%d%d",&op,&x,&y);
        if(op==1) add(x,y);
        else printf("%d\n",ask(y)-ask(x-1));
    }
    return 0;
}
View Code

模板二(区间操作):

#include<bits/stdc++.h>

using namespace std;

const int N=5e5+5;

int n,m;
int a[N];
int c[N];

void add(int x,int y) {
    for(; x<=n; x+=x&-x) c[x]+=y;
}

int ask(int x) {
    int ans=0;
    for(; x; x-=x&-x) ans+=c[x];
    return ans;
}

int main() {
    scanf("%d%d",&n,&m);
    int last=0;
    for(int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
        add(i,a[i]-last);
        last=a[i];
    }
    for(int i=1; i<=m; i++) {
        int op,x;
        scanf("%d%d",&op,&x);
        if(op==1) {
            int y,z;
            scanf("%d%d",&y,&z);
            add(x,z);
            add(y+1,-z);
        } else printf("%d\n",ask(x));
    }
    return 0;
}
View Code

 

posted on 2022-05-14 18:02  我疯故我在  阅读(34)  评论(0)    收藏  举报