线段树70分求调
查看原帖
线段树70分求调
993679
yangsiyao楼主2024/8/2 12:47
#include <bits/stdc++.h>
using namespace std;
long long n,m,p[500002],a,b,c,d;
struct tree{
	long long k,lazy,l,r;
}k[500002];
void build(long long l,long long r,long long p1){
	long long h=p1*2,j=h+1;
	k[p1].l=l,k[p1].r=r; 
	if(l==r){k[p1].k=p[l];return;}
	long long mid=(l+r)/2;
	build(l,mid,h),build(mid+1,r,j);
	k[p1].k=k[h].k+k[j].k;
}
void pushup(long long p1){
	k[p1].k=k[p1*2].k+k[p1*2+1].k;
}
void lazy1(long long p1){
	if(k[p1].lazy){
		long long h=p1*2,j=h+1;
		if(k[p1].l==k[p1].r){k[p1].lazy=0;return;}
		k[h].lazy+=k[p1].lazy,k[j].lazy+=k[p1].lazy;
		k[h].k+=(k[h].r-k[h].l+1)*k[p1].lazy;
		k[j].k+=(k[j].r-k[j].l+1)*k[p1].lazy;
		k[p1].lazy=0;
		lazy1(h),lazy1(j);
	}
}
void insert(long long l,long long r,long long k1,long long p1){
	if(l<=k[p1].l && k[p1].r<=r){k[p1].k+=(k[p1].r-k[p1].l+1)*k1,k[p1].lazy+=k1;return;}
	long long mid=(k[p1].l+k[p1].r)/2;
	lazy1(p1);
	if(mid>=l)insert(l,r,k1,p1*2); 
	if(mid<r)insert(l,r,k1,p1*2+1);
	pushup(p1);
}
long long search(long long l,long long r,long long p1){
	if(l<=k[p1].l && k[p1].r<=r) return k[p1].k;
	long long sum=0;
	long long mid=(k[p1].l+k[p1].r)/2;
	lazy1(p1);
	if(mid>=l) sum+=search(l,r,p1*2);
	if(mid<r) sum+=search(l,r,p1*2+1);
	return sum;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(),cout.tie(); 
	cin >> n >> m;
	for(long long i=1;i<=n;i++) cin >> p[i];
	build(1,n,1);
	while(m--){
		cin >> a;
		if(a==1){
			cin >> b >> c >> d;insert(b,c,d,1);
		}else{
			cin >> b >>c;
			cout << search(b,c,1) << "\n";
		}
	}
}

https://www.luogu.com.cn/record/170064318

2024/8/2 12:47
加载中...