萌新求助线段树
查看原帖
萌新求助线段树
311921
_晓风残月_楼主2021/1/27 21:18
#include<bits/stdc++.h>
using namespace std;
const int maxn=200001,inf=0x7fffffff;
int a[maxn],C[maxn*4],n,q,A,B,ans[maxn],tmp=1;
inline int read()
{
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
inline void pushup(int id)
{
	C[id]=max(C[id<<1],C[id<<1|1]);
	return;
}
inline void build(int id,int l,int r)
{
	if(l==r)
	{
		C[id]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	pushup(id);
}
inline void update(int id,int l,int r,int x,int y)
{
	if(l==r)
	{
		if(C[id]<y)
		{
			C[id]=y;
		}
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
	{
		update(id<<1,l,mid,x,y);
	}
	else
	{
		update(id<<1|1,mid+1,r,x,y);
	}
	pushup(id);
}
inline int query(int id,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return C[id];
	}
	int mid=(l+r)>>1,ans=-inf;
	if(x<=mid)
	{
		ans=max(ans,query(id<<1,l,mid,x,y));
	}
	if(y>mid)
	{
		ans=max(ans,query(id<<1,mid+1,r,x,y));
	}
	return ans;
}
int main()
{
	n=read();
	q=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	build(1,1,n);
	char op[5];
	while(q--)
	{
		scanf("%s",op);
		if(op[0]=='Q')
		{
			A=read(),B=read();
			ans[tmp++]=query(1,1,n,A,B);
		}
		else
		{
			A=read(),B=read();
			update(1,1,n,A,B);
		}
	}
	for(int i=1;i<tmp;i++)
	{
		printf("%d",ans[i]);
		puts("");
	}
}
2021/1/27 21:18
加载中...