萌新线段树60pts求助
查看原帖
萌新线段树60pts求助
442644
DTCT楼主2022/1/20 16:49

最后4个点WA了

#include<cstdio>
#define LL long long
LL read(){
	LL x=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c<='9'&&c>='0'){x=((x<<3)+(x<<1)+(c^48));c=getchar();}
	return x*f;
}
void read(LL&x){
	x=0;
	LL f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c<='9'&&c>='0'){x=((x<<3)+(x<<1)+(c^48));c=getchar();}
	x=x*f;
}
void write(LL x){
    char ch[20];
    LL len=0;
    if(x<0){
        putchar('-');
        x=~x+1;
    }
    do{
        ch[len++]=x%10+48;
        x/=10;
    }while(x>0);
    LL i;
    for(i=len-1;i>=0;i--)
       putchar(ch[i]);
    return;
}
LL max(LL x,LL y){
	return x>y?x:y;
}
LL a[1000001],nl,nr;
LL x;
struct SGT{
	LL mx=0x8000000000000000,w,add;
	bool b;
}sgt[4000004];
void build(LL rt,LL l,LL r);
void pushdown(LL rt,LL l,LL r);
void uw(LL rt,LL l,LL r);
void uadd(LL rt,LL l,LL r);
LL ask(LL rt,LL l,LL r);
signed main(){
//	freopen("P1253.in","r",stdin);
//	freopen("P1253.out","w",stdout);
	LL n,q,op;
	read(n);
	read(q);
	for(LL i=1;i<=n;i++)
		read(a[i]);
	build(1,1,n);
	while(q--){
		read(op);
		switch(op){
			case 1:
				read(nl);
				read(nr);
				read(x);
				uw(1,1,n);
				break;
			case 2:
				read(nl);
				read(nr);
				read(x);
				uadd(1,1,n);
				break;
			case 3:
				read(nl);
				read(nr);
				write(ask(1,1,n));
				putchar('\n');
				break;
		}
	}
}
void build(LL rt,LL l,LL r){
	if(l==r)
		sgt[rt].mx=a[l];
	else{
		LL m=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
		build(ls,l,m);
		build(rs,m+1,r);
		sgt[rt].mx=max(sgt[ls].mx,sgt[rs].mx);
	}
}
void pushdown(LL rt){
	LL ls=rt<<1,rs=rt<<1|1;
	if(sgt[rt].b){
		sgt[ls].mx=sgt[ls].w=sgt[rt].w;
		sgt[rs].mx=sgt[rs].w=sgt[rt].w;
		sgt[rt].b=0;
		sgt[ls].add=sgt[rs].add=0;
	}
	sgt[ls].add+=sgt[rt].add;
	sgt[rs].add+=sgt[rt].add;
	sgt[ls].mx+=sgt[rt].add;
	sgt[rs].mx+=sgt[rt].add;
	sgt[rt].add=0;
}
void uadd(LL rt,LL l,LL r){
	if(l>=nl&&r<=nr){
		sgt[rt].add+=x;
		sgt[rt].mx+=x;
	}
	else{
		pushdown(rt);
		LL m=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
		if(nl<=m)
			uadd(ls,l,m);
		if(nr>m)
			uadd(rs,m+1,r);
		sgt[rt].mx=max(sgt[ls].mx,sgt[rs].mx);
	}
}
void uw(LL rt,LL l,LL r){
	if(l>=nl&&r<=nr){
		sgt[rt].add=0;
		sgt[rt].mx=sgt[rt].w=x;
		sgt[rt].b=true;
	}
	else{
		pushdown(rt);
		LL m=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
		if(nl<=m)
			uw(ls,l,m);
		if(nr>m)
			uw(rs,m+1,r);
		sgt[rt].mx=max(sgt[ls].mx,sgt[rs].mx);
	}
}
LL ask(LL rt,LL l,LL r){
	if(l>=nl&&r<=nr)
		return sgt[rt].mx;
	else{
		LL ans(0x8000000000000000);
		pushdown(rt);
		LL m=(l+r)>>1,ls=rt<<1,rs=rt<<1|1;
		if(nl<=m)
			ans=max(ans,ask(ls,l,m));
		if(nr>m)
			ans=max(ans,ask(rs,m+1,r));
		return ans;
	}
}
2022/1/20 16:49
加载中...