线段树

代码

单点加,区间和。

#include<bits/stdc++.h>
using namespace std;
const int N =5e5+10;
struct TREE{
	int v,l,r;
}c[N<<2];
#define l(i) ((i)<<1)
#define r(i) (((i)<<1)+1)
int a[N],n,m;
void build(int k,int l,int r) {
	c[k].l=l,c[k].r=r;
	if(l==r) {c[k].v=a[l]; return ;}
	int mid=l+r>>1;
	build(l(k),l,mid);
	build(r(k),mid+1,r);
	c[k].v=c[l(k)].v+c[r(k)].v;
}
void upd(int k,int x,int v) {
	if(c[k].l==c[k].r) {c[k].v+=v; return ;}
	int mid=c[k].l+c[k].r>>1;
	if(x<=mid) upd(l(k),x,v);
	else upd(r(k),x,v);
	c[k].v=c[l(k)].v+c[r(k)].v;
}
int ask(int k,int x,int y) {
	if(x<=c[k].l&&c[k].r<=y) return c[k].v;
	int mid=c[k].l+c[k].r>>1,v=0;
	if(x<=mid) v+=ask(l(k),x,y);
	if(y>mid)  v+=ask(r(k),x,y);
	return v;
}
int main() {
	ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
	}
	build(1,1,n);
	while(m--) {
		int o,l,r;
		cin>>o>>l>>r;
		if(o==1) {
			upd(1,l,r);
		}
		else 
			cout<<ask(1,l,r)<<"\n";
	}
	return 0;
}

区间加,区间和。

#include<bits/stdc++.h>
using namespace std;
const int N =5e5+10;
#define int long long
struct TREE{
	int v,l,r,p;
	#define l(i) ((i)<<1)
	#define r(i) (((i)<<1)+1)
}c[N<<2];
int a[N],n,m;
void build(int k,int l,int r) {
	c[k].l=l,c[k].r=r;
	if(l==r) {c[k].v=a[l]; return ;}
	int mid=l+r>>1;
	build(l(k),l,mid);
	build(r(k),mid+1,r);
	c[k].v=c[l(k)].v+c[r(k)].v;
}
void spd(int k) {
	if(c[k].p) {
		c[l(k)].v+=c[k].p*(c[l(k)].r-c[l(k)].l+1);
		c[r(k)].v+=c[k].p*(c[r(k)].r-c[r(k)].l+1);
		c[l(k)].p+=c[k].p;
		c[r(k)].p+=c[k].p;
		c[k].p=0;
	}
}
void upd(int k,int x,int y,int v) {
	if(x<=c[k].l&&c[k].r<=y) {
		c[k].v+=(c[k].r-c[k].l+1)*v;
		c[k].p+=v;
		return ;
	}
	spd(k);
	int mid=c[k].l+c[k].r>>1;
	if(x<=mid) upd(l(k),x,y,v);
	if(y>mid) upd(r(k),x,y,v);
	c[k].v=c[l(k)].v+c[r(k)].v;
}
int ask(int k,int x,int y) {
	if(x<=c[k].l&&c[k].r<=y) return c[k].v;
	spd(k);
	int mid=c[k].l+c[k].r>>1,v=0;
	if(x<=mid) v+=ask(l(k),x,y);
	if(y>mid)  v+=ask(r(k),x,y);
	return v;
}
signed main() {
	ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
	}
	build(1,1,n);
	while(m--) {
		int o,l,r,k;
		cin>>o>>l>>r;
		if(o==1) {
			cin>>k;
			upd(1,l,r,k);
		}
		else {
			cout<<ask(1,l,r)<<"\n";
		}
	}
	return 0;
}
posted @ 2023-10-10 13:45  cjrqwq  阅读(6)  评论(0)    收藏  举报  来源