线段树0分求调
查看原帖
线段树0分求调
1041859
space_P楼主2024/11/22 20:08
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=101111;
int n,m,a[N];
int tr[N<<2],add[N<<2];
int ls(int k){
	return k<<1;
}
int rs(int k){
	return (k<<1)|1;
}
void pu(int k){
	tr[k]=tr[ls(k)]+tr[rs(k)];
}
void pd(int k,int l,int r){
	add[ls(k)]+=add[k];
	add[rs(k)]+=add[k];
	int mid=(l+r)>>1;
	tr[ls(k)]+=add[k]*(mid-l+1);
	tr[rs(k)]+=add[k]*(r-mid);
	add[k]=0;
}
void blind(int k,int l,int r){
	if(l==r){
		tr[k]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	blind(ls(k),l,mid);
	blind(rs(k),mid+1,r);
	pu(k);
}
void ru(int k,int l,int r,int ul,int ur,int ad){
	if(ul > r || ur < l) return;
	if(ul >= l && ur <= r){
		add[k]+=ad;
		tr[k]+=ad*(r-l+1);
		return;
	}
	pd(k,l,r);
	int mid=(l+r)>>1;
	ru(ls(k),l,mid,ul,ur,ad);
	ru(rs(k),mid,r,ul,ur,ad);
	pu(k);
}
int rq(int k,int l,int r,int ql,int qr){
	if(qr < l || ql >r) return 0;
	if(qr >= l && qr <= r){
		return tr[k];
	}
	int mid=(l+r)>>1;
	pd(k,l,r);
	return rq(ls(k),l,mid,ql,qr)+rq(rs(k),mid+1,r,ql,qr);
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	blind(1,1,n);
	while(m--){
		int opt;
		cin>>opt;
		if(opt^1){
			int l,r;
			cin>>l>>r;
			cout<<rq(1,1,n,l,r)<<endl;
		}
		else {
			int l,r,ad;
			cin>>l>>r>>ad;
			ru(1,1,n,l,r,ad);
		}
	}
	return 0;
}
2024/11/22 20:08
加载中...