菜鸡写炸了求助
查看原帖
菜鸡写炸了求助
363669
hwwqy楼主2022/9/23 16:35
#include<bits/stdc++.h>
#define int long long
#define ls x<<1
#define rs x<<1|1 
#define int_max 2147483647
using namespace std;
const int S=1000100;
int mx[S<<3],taga[S<<3],tagc[S<<3],a[S],n,m;
inline int read()
{
	int a=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-f;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		a=a*10+ch-'0';
		ch=getchar();
	}
	return a*f;
}
void update(int l,int r,int x)
{
	if(l!=r)
	{
		mx[x]=max(mx[ls],mx[rs]);
	//	cout<<x<<" "<<mx[ls]<<" "<<mx[rs]<<endl;
	}
}

void build(int l,int r,int x)
{
	tagc[x]=int_max;
	if(l==r)
	{
		mx[x]=a[l];
		
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,ls);
	build(mid+1,r,rs);
	update(l,r,x);
//	cout<<x<<" "<<mx[x]<<endl;
	return ;
}
void pushdown(int l,int r,int x)
{
	if(taga[x]==0&&tagc[x]==int_max)return;
	int mid=l+r>>1;
	if(tagc[x]!=int_max)
	{
			tagc[rs]=tagc[x];
			tagc[ls]=tagc[x];
			mx[ls]=tagc[x];
			mx[rs]=tagc[x];

			tagc[x]=int_max;
			taga[x]=0;
			return;
	}
	else if(l!=r)
	{
		mx[ls]+=taga[x];
		mx[rs]+=taga[x];
		taga[ls]+=taga[x];
		taga[rs]+=taga[x];
		
	}
//	tagc[x]=int_max;
	taga[x]=0;
}
int query(int x,int l,int r,int ql,int qr)
{
	
	if(ql<=l&&r<=qr)return mx[x];	
	int mid=l+r>>1;
//	cout<<mid<<endl;
	pushdown(l,r,x);
	if(qr<=mid)
	{
		return query(ls,l,mid,ql,qr);
	}
	else if(qr>mid)
	{
		return query(rs,mid+1,r,ql,qr);
	}
	else return max(query(ls,l,mid,ql,mid),query(rs,mid+1,r,mid+1,qr));
}
void add(int x,int l,int r,int ql,int qr,int k)
{
	
	if(ql==l&&r==qr)
	{
		mx[x]+=k;
		taga[x]+=k;
	//	cout<<mx[x]<<" "<<x<<endl;
	
		return;
	}
	pushdown(l,r,x);
	int mid=l+r>>1;
	//cout<<mid<<endl;
	if(qr<=mid)
	{
		add(ls,l,mid,ql,qr,k);
	}
	else if(ql>mid)
	{
		add(rs,mid+1,r,ql,qr,k);
	}
	else
	{
		add(ls,l,mid,ql,mid,k);
		add(rs,mid+1,r,mid+1,qr,k);
	}
	update(l,r,x);
}
void change(int x,int l,int r,int ql,int qr,int k)
{
	
	if(ql<=l&&r<=qr)
	{
		mx[x]=k;
		tagc[x]=k;
		taga[x]=0;
		return;
	}
	pushdown(l,r,x);
	int mid=l+r>>1;
	if(qr<=mid)
	{
		change(ls,l,mid,ql,qr,k);
	}
	else if(ql>mid)
	{
		change(rs,mid+1,r,ql,qr,k);
	}
	else
	{
		change(ls,l,mid,ql,mid,k);
		change(rs,mid+1,r,mid+1,qr,k);
	}
	update(l,r,x);
	
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,n,1);
	//for(int i=1;i<=13;i++)cout<<mx[i]<<" ";
	//	cout<<endl;
	for(int i=1;i<=m;i++)
	{
		int op,l,r,x;
		op=read(),l=read(),r=read();
		if(op==1||op==2)x=read();
		if(op==1)
		{
			change(1,1,n,l,r,x);	
		}	
		else if(op==2)
		{
			add(1,1,n,l,r,x);	
		}	
		else
		{
			cout<<query(1,1,n,l,r)<<endl;	
		}
	//	for(int i=1;i<=13;i++)cout<<mx[i]<<" ";
	//	cout<<endl;
	}
    return 0;
}

他们都说我的线段树码风太新奇了

2022/9/23 16:35
加载中...