玄关 70分 RE 求调QWQ
  • 板块灌水区
  • 楼主_zsy_
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/8/5 21:29
  • 上次更新2024/8/5 23:48:54
查看原帖
玄关 70分 RE 求调QWQ
1264271
_zsy_楼主2024/8/5 21:29

P1531

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100000
#define ls(x) (x<<1)
#define rs(x) (x<<1)+1

int a[MAXN];

struct Tree
{
    int l,r,val;
};

int n;

struct SEG
{
	Tree t[MAXN<<2];
	
	void pushup(int x)
	{
		t[x].val=max(t[ls(x)].val, t[rs(x)].val);
		return;
	}
	
	void build(int l, int r, int x)
	{
		t[x].l=l, t[x].r=r;
		if(l==r)
		{
			t[x].val=a[l];
			return;
		}
		int mid=(l+r)>>1;
		build(l, mid, ls(x)), build(mid+1, r, rs(x));
		pushup(x);
		return;
	}
	
	void add(int l, int r, int k, int x)
	{
		if(t[x].l>r||t[x].r<l) return;
		if(t[x].l==l&&t[x].r==r)
		{
			t[x].val = k;
			return;
		}
		add(l, r, k, ls(x)),add(l, r, k, rs(x));
		pushup(x);
		return;
    }
	
	int ask(int l, int r, int x)
	{
		if(t[x].l>r||t[x].r<l) return 0;
		if(t[x].l>=l&&t[x].r<=r)return t[x].val;
		pushup(x);
		return max(ask(l, r, ls(x)),ask(l, r, rs(x)));
	}
	
}seg;

int main()
{
	int m,x,y;
	char tmp;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	seg.build(1,n,1);
	
	for(int i=1;i<=m;i++)
	{
		cin>>tmp;
		switch(tmp)
		{
			case 'Q':
				cin>>x>>y;
				cout<<seg.ask(x, y, 1)<<endl;
				break;
		    case 'U':
		    	cin>>x>>y;
		    	if(a[x]<y)
				{
				    seg.add(x, x, y, 1);
				    a[x]=y;
				}
		    	break;
		}
	}
	return 0;
}
2024/8/5 21:29
加载中...