线段树RE……
查看原帖
线段树RE……
1050431
DevilsFlame楼主2024/7/22 12:12
#include<bits/stdc++.h>
#define ls d<<1
#define rs d<<1+1
using namespace std;
const int N = 200010;
int a,b,n,m,s[N];
char f;
struct tree
{
	int l,r,m;
}v[N * 4];
inline void read(int &x)//快读
{
	x = 0;
	int f = 1;
	char s = getchar();
	while(s < '0' || s > '9')
	{
		if(s == '-') f = -1;
		s = getchar();
	}
	while(s >= '0' && s <= '9')
	{
		x = x * 10 + s - 48;
		s = getchar();
	}
	x *= f;
	return;
}
void write(int x)//快写
{
	if(x < 0)
	{
		x = -1;
		putchar('-');
	}
	if(x > 9) write(x / 10);
	putchar(x % 10 + 48);
	return;
}
void build(int l,int r,int d)//建树
{
	v[d].l = l,v[d].r = r;
	if(l == r)
	{
		v[d].m = s[l];
		return;
	}
	int mid = (l + r - 1) >> 1;
	build(l,mid,ls);
	build(mid + 1,r,rs);
	v[d].m = max(v[ls].m,v[rs].m);
	return;
}
int find(int d)
{
	if(v[d].r < a || v[d].l > b) return 0;
	if(v[d].l >= a && v[d].r <= b) return v[d].m;
	int mid = (v[d].l + v[d].r) >> 1;
	int res = 0;
	res = find(ls);
	res = max(res,find(rs));
	return res;
}
void change(int d)
{
	if(v[d].r < a || v[d].l > a) return;
	v[d].m = max(v[d].m,b);
	change(ls);
	change(rs);
	return;
}
int main()
{
	read(n),read(m);
	for(int i = 1;i <= n;i ++) read(s[i]);
	build(1,n,1);
	while(m --)
	{
		f = getchar();
		while(f != 'U' && f != 'Q') f = getchar();
		read(a),read(b);
		switch(f)
		{
			case 'Q':
				write(find(1));
				putchar('\n');
				break;
			case 'U':
				if(s[a] < b) change(1);
				break;
		}
	}
	return 0;
}
2024/7/22 12:12
加载中...