P3374 【模板】树状数组 1

呐,如题,树状数组模板,单点修改+区间查询

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=500005;

int n,m;
int a[N];

int lowbit(int l){return l&(-l);}

void update(int l,int u){//读入操作
	for(;l<=n;l+=lowbit(l)){
		a[l]+=u;
	}
}

int sum(int k){//前缀求和
	int an=0;
	for(;k;k-=lowbit(k)){
		an+=a[k];
	}
	return an;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int u;
		scanf("%d",&u);
		update(i,u);
	}
	//for(int i=1;i<=n;i++){
	//	printf("%d ",a[i]);
	//}
	//printf("
");
	for(int i=1;i<=m;i++){
		int p,k,l;
		scanf("%d%d%d",&p,&k,&l);
		if(p==1){
			for(int j=k;j<=n;j+=lowbit(j)){
				a[j]+=l;
			}
		}
		else{
			printf("%d
",sum(l)-sum(k-1));//将l-r的区间理解为r的前缀和减去(l-1)的前缀和
		}
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/hahaha2124652975/p/11200013.html