求助!!蒟蒻才过5个点50 pts,哪位dalao帮忙!!
查看原帖
求助!!蒟蒻才过5个点50 pts,哪位dalao帮忙!!
519384
Link_Cut_Y楼主2021/8/28 17:40
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>


using namespace std;

const int N=2e5+10;

struct Stu
{
	int l,r;
	int v;
}tr[N*4];

int n,m;
int w[N];

void pushup(int u)
{
	tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);
}

void build(int u,int l,int r)
{
	tr[u]={l,r,w[r]};
	if(l==r) return;
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}

void modify(int u,int x,int v)
{
	if(tr[u].l==x && tr[u].r==x) tr[u].v=v;
	else
	{
		int mid=(tr[u].l+tr[u].r)>>1;
		if(x<=mid) modify(u<<1,x,v);
		else modify(u<<1|1,x,v);
		pushup(u);
	}
}

int query(int u,int l,int r)
{
	if(tr[u].l>=l && tr[u].r<=r) return tr[u].v;
	
	int mid=(tr[u].l+tr[u].r)>>1;
	int v=0;
	
	if(l<=mid) v=query(u<<1,l,r);
	if(r>mid) v=max(query(u<<1|1,l,r),v);
	return v;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&w[i]);
	}
	
	build(1,1,n);
	
	char op[2];
	int l,r;
	
	while(m--)
	{
		scanf("%s%d%d",op,&l,&r);
		if(*op=='Q')
		{
			printf("%d\n",query(1,l,r));
		}
		else modify(1,l,r);
	}
	
	return 0;
}
2021/8/28 17:40
加载中...