线段树代码过不了样例,求死因
查看原帖
线段树代码过不了样例,求死因
1020916
mcmahaoran楼主2025/1/16 17:01

rt,code:

#include<iostream>
#define int long long
using namespace std;

const int N=1e6+5;

int n,m;
int a[N];

struct node{
	int l,r,s,la,max;
}t[N*4];

inline void pushup(int i){
	int ls=i*2,rs=i*2+1;
	t[i].s=t[ls].s+t[rs].s;
	return ;
}

inline void pushdown(int i){
	int ls=i*2,rs=i*2+1;
	t[ls].s+=t[i].s*(t[ls].r-t[ls].l+1);
	t[rs].s+=t[i].s*(t[rs].r-t[rs].l+1);
	t[ls].la+=t[i].la;
	t[rs].la+=t[i].la;
	t[i].la=0;
	return ;
}

inline void build(int i,int l,int r){
	int ls=i*2,rs=i*2+1;
	int mid=(l+r)>>1;
	t[i].l=l,t[i].r=r;
	if(l==r){
		t[i].s=a[l];
		return ;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(i);
	return ;
}

inline void update(int i,int l,int r,int k){
	int ls=i*2,rs=i*2+1;
	int mid=(t[i].l+t[i].r)>>1;
	if(l<=t[i].l&&r>=t[i].r){
		t[i].s+=k*(t[i].r-t[i].l+1);
		t[i].la+=k;
		return ;
	}
	pushdown(i);
	if(l<=mid)update(ls,l,r,k);
	if(r>mid)update(rs,l,r,k);
	pushup(i);
	return ;
}

inline int query(int i,int l,int r){
	int ls=i*2,rs=i*2+1;
	int s=0,mid=(t[i].l+t[i].r)>>1;
	if(l<=t[i].l&&r>=t[i].r)return t[i].s;
	pushdown(i);
	if(l<=mid)s+=query(ls,l,r);
	if(r>mid)s+=query(rs,l,r);
	return s;
}

inline void work(){
	int op,x,y;
	cin>>op>>x>>y;
	if(op==1){
		int k;
		cin>>k;
		update(1,x,y,k);
	}else if(op==2){
		cout<<query(1,x,y)<<"\n";
	}
	return ;
}

signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--)work();
	return 0;
}
2025/1/16 17:01
加载中...