求助线段树,全RE了
查看原帖
求助线段树,全RE了
448884
快乐的大童楼主2022/1/24 13:41

RT

#include<bits/stdc++.h>
using namespace std; 
typedef long long ll;
const int N=1e6+5;
ll d[N],b[N],a[N],k;
int op,l,r,n,q;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	char z[25];
	int y=0;
	while(x||!y){
		z[y++]=x%10+48;
		x/=10;
	}
	while(y--){
		putchar(z[y]);
	} 
	putchar(10);
}
int leftson(int x){
	return x<<1;
}
int rightson(int x){
	return (x<<1)|1;
}
void build(int l,int r,int p){
	if(l==r){
		d[p]=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(l,mid,leftson(p));
	build(mid+1,r,rightson(p));
	d[p]=d[leftson(p)]+d[rightson(p)];
}
void change(int L,int R,int l,int r,int p,int x){
	if(L<=l&&r<=R){
		d[p]+=(r-l+1)*x;
		b[p]+=x;
		return;
	}
	ll mid=(l+r)>>1;
	if(b[p]){
		d[leftson(p)]+=b[p]*(mid-l+1),d[rightson(p)]+=b[p]*(r-mid);
		b[leftson(p)]+=b[p],b[rightson(p)]+=b[p];
		b[p]=0;
	}
	if(l<=mid) change(L,R,l,mid,leftson(p),x);
	if(r>mid) change(L,R,mid+1,r,rightson(p),x);
	d[p]=d[leftson(p)]+d[rightson(p)];
}
ll get_sum(int L,int R,int l,int r,int p){
	if(L<=l&&r<=R) return d[p];
	ll mid=(l+r)>>1,res=0;
	if(b[p]){
		d[leftson(p)]+=b[p]*(mid-l+1),d[rightson(p)]+=b[p]*(r-mid);
		b[leftson(p)]+=b[p],b[rightson(p)]+=b[p];
		b[p]=0;
	}
	if(l<=mid) res+=get_sum(L,R,l,mid,leftson(p));
	if(r>mid) res+=get_sum(L,R,mid+1,r,rightson(p));
	return res;
}
int main(){
	std::ios::sync_with_stdio(0);
	n=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,n,1);
	while(q--){
		op=read(),l=read(),r=read();
		if(op==1){
			k=read();
			change(l,r,1,n,1,k);
		}else{
			write(get_sum(l,r,1,n,1));
		}
	}
}
2022/1/24 13:41
加载中...