洛谷 P3374 【模板】树状数组 1
洛谷 P3368 【模板】树状数组 2
单点修改和区间查询
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
int a[1000000],c[1000000];
inline int read(){
int x=0,w=1;char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch-48),ch=getchar();
return x*w;
}
inline void add(int x,int y) { while(x<=n){ c[x]+=y; x+=x&-x; } }
inline int getsum(int x){ int ans=0; while(x) { ans+=c[x]; x-=x&-x; } return ans;}
int main(){
n=read();m=read();
for(register int i=1;i<=n;++i) a[i]=read(),add(i,a[i]);
for(register int i=1;i<=m;++i) {
int op=read(),x=read(),y=read();
if(op==1) add(x,y);
else if(op==2) printf("%d\n",getsum(y)-getsum(x-1));
}
return 0;
}
区间修改和单点查询
#include<iostream>
#include<cstdio>
#define maxn 500100
using namespace std;
int n,m,c[maxn],a[maxn];
inline int read(){
int x=0,w=1;char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch-48),ch=getchar();
return x*w;
}
inline int add(int x,int k){ for(int i=x;i<=n;i+=i&(-i)) c[i]+=k; }
inline int query(int x) { int sum=0; for(int i=x;i>0;i-=i&(-i)) sum+=c[i]; return sum ;}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++) a[i]=read();
while(m--){
int k=read();
if(k==1){int x=read(),y=read(),z=read();add(x,z); add(y+1,-z);}//维护差分数组
else{int x;x=read();printf("%d\n",a[x]+query(x)); }//query()求的是改变的值,再加上原来的值就可以了
}
return 0;
}
区间修改、区间查询
参见lcf大佬的博客:https://www.cnblogs.com/lcf-2000/p/5866170.html
另外一个大佬博客 https://www.cnblogs.com/RabbitHu/p/BIT.html