模板一(单点操作):
#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; }
模板二(区间操作):
#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; }

浙公网安备 33010602011771号