两种树状数组

单点修改,区间查询树状数组,洛谷P3374

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, m, a[N];
int chaxun(int n){
	int ans = 0;
	while(1){
		ans += a[n];
		int x = n & -n;
		n -= x;
		if(n == 0) break;
	}
	return ans;
}
void xiugai(int n, int d){
	while(1){
		a[n] += d;
		int x = n & -n;
		n += x;
		if(n >= N) break;
	}
	return;
}
int main(){
	int f, x, y;
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> x;
		xiugai(i,x);	
	}
	while(m--){
		cin >> f >> x >> y;
		if(f == 1) xiugai(x, y);
		if(f == 2){
			cout << chaxun(y) - chaxun(x-1) << endl;
		}
	}
	return 0;
}

区间修改,单点查询树状数组,洛谷P3368

把上面那个改成在原数组差分数组上做

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, m, s[N], a[N];
int chaxun(int n){
	int ans = 0;
	while(1){
		ans += s[n];
		int x = n & -n;
		n -= x;
		if(n == 0) break;
	}
	return ans;
}
void xiugai(int n, int d){
	while(1){
		s[n] += d;
		int x = n & -n;
		n += x;
		if(n >= N) break;
	}
	return;
}
int main(){
	int f, x, y, k;
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		x = a[i] - a[i-1];
		xiugai(i,x);	
	}
	while(m--){
		cin >> f;
		if(f == 1){
			cin >> x >> y >> k;
			xiugai(x,k);
			xiugai(y+1,-k);
		}
		if(f == 2){
			cin >> x;
			cout << chaxun(x) << endl;
		}
	}
	return 0;
}
posted @ 2025-10-17 22:59  Turkey_VII  阅读(3)  评论(0)    收藏  举报