求大佬帮忙改改吧,标记永久化线段树
查看原帖
求大佬帮忙改改吧,标记永久化线段树
181715
gjh303987897楼主2022/2/28 00:21
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 1000001;
int n,m,sum[maxn],a[maxn],add[maxn];
void build(int k,int l,int r){
	if(l==r){
		sum[l]=a[k];
		return ;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1+1,mid+1,r);
	sum[k]=sum[k<<1+1]+sum[k<<1];
}
void quary(int k,int l,int r,int x,int y,int p){//xy上+p 
	if(x<=l&&y>=r){
		add[k]+=p;
		return;
	}
	sum[k]+=(min(y,r)-max(l,x)+1)*p;
	int mid=(l+r)>>1;
	quary(k<<1,l,mid,x,y,p); 
	quary(k<<1+1,mid+1,r,x,y,p);	
}
int ask(int k,int l,int r,int x,int y){
	if(x<=l&&y>=r){
		return add[k]*(r-l+1)+sum[k];
	}
	int res=(min(y,r)-max(l,x)+1)*add[k];
	int mid=(l+r)>>1;
	res+=ask(k<<1,l,mid,x,y);
	res+=ask(k<<1+1,mid+1,r,x,y);
	return res;
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int pd; cin>>pd;
		if(pd==1){
			int x,y,k;
			cin>>x>>y>>k;
			quary(1,1,n,x,y,k);
		}
		if(pd==2){
			int x,y;
			cin>>x>>y;
			cout<<ask(1,1,n,x,y)<<endl;
		}
	}
	return 0;
}
2022/2/28 00:21
加载中...