一.树状数组单点更新区间查询
传送门P3374树状数组模板1
#include<bits/stdc++.h>
#define M int(5e5)
using namespace std;
int n,m,x,a,b,c,tree[M];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
inline int lowbit(int x){
return x&(-x);
}
inline void update(int x,int y){
while(x<=n){
tree[x]+=y;
x+=lowbit(x);
}
}
inline int query(int x){
int sum=0;
while(x>0){
sum+=tree[x];
x-=lowbit(x);
}
return sum;
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++){
x=read();update(i,x);
}
for(int i=1;i<=m;i++){
a=read(),b=read(),c=read();
if(a==1)update(b,c);
if(a==2)cout<<query(c)-query(b-1)<<'\n';
}
return 0;
}
二.树状数组区间更新单点查询
传送门P3368树状数组模板2
#include<bits/stdc++.h>
using namespace std;
#define MAXN int(5e5) + 1
int n = 0; int m = 0;
int a[MAXN] = { 0 };
int c[MAXN] = { 0 };
int t[4 * MAXN] = { 0 };
inline int lowbit(int x){ return x & -x; }
void add(int x, int y){
for(; x <= n; x += lowbit(x)) t[x] += y;
}
int query(int x){
int ans = 0;
for(; x; x -= lowbit(x)) ans += t[x];
return ans;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i++) c[i] = a[i] - a[i-1], add(i, c[i]);//差分数组
for(int i = 1; i <= m; i++){
int op = 0; scanf("%d", &op);
if(op == 1){
int x, y, k; scanf("%d%d%d", &x, &y, &k);
add(x, k); add(y + 1, -k);
}
else{
int x = 0; scanf("%d", &x);
cout << query(x) << '\n';
}
}
return 0;
}
三.树状数组求逆序对
离散化+树状数组
#include<bits/stdc++.h>
#define in read()
#define MAXN 500050
using namespace std;
int n,a[MAXN],b[MAXN],len=0,ans=0,t[4*MAXN];
inline int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return x*f;
}
inline int finds(int x){return lower_bound(b+1,b+len+1,x)-b;}
int lowbit(int x){
return x&(-x);
}
void update(int x,int y){
int tot=0;
while(x<=n){
t[x]+=y;
x+=lowbit(x);
}
}
int query(int x){
int sum=0;
while(x){
sum+=t[x];
x-=lowbit(x);
}
return sum;
}
int main(){
n=in;
for(int i=1;i<=n;i++){
a[i]=in;
b[i]=a[i];
}
sort(b+1,b+n+1);
len=unique(b+1,b+n+1)-b-1;
for(int i=n;i>=1;i--){
int k=finds(a[i]);
update(k,1);
ans+=query(k-1);
}
cout<<ans<<'\n';
return 0;
}