线段树,对于点的更新, 求区间最大值。
#include <iostream>
#include <algorithm>
#include <cstdio>
#define MAX (200000+5)
using namespace std;
struct node
{
int l, r, max;
}v[3*MAX];
int a[MAX];
void pushup(int n)
{
v[n].max = max(v[2*n].max, v[2*n+1].max);
}
void build(int l, int r, int n)
{
v[n].l = l;
v[n].r = r;
if (r == l)
{
v[n].max = a[r];
return ;
}
int mid = (l + r) /2;
build(l, mid, 2*n);
build(mid+1, r, 2*n+1);
pushup(n);
}
void update(int x, int d, int n)
{
if (v[n].l == v[n].r)
{
v[n].max = d;
return ;
}
int mid = (v[n].l + v[n].r) / 2;
if (x <= mid)
update(x, d, 2*n);
else
update(x, d, 2*n+1);
pushup(n);
}
int query(int l, int r, int n)
{
if (l<=v[n].l && v[n].r<=r)
{
return v[n].max;
}
int mid = ( v[n].l + v[n].r ) /2;
if (r <= mid)
return query(l, r, 2*n);
else if (l > mid)
return query(l, r, 2*n+1);
else
return max( query(l, mid, 2*n), query(mid+1, r, 2*n+1) );
}
int main()
{
int N, M, n, m;
char ch;
while (~scanf("%d%d", &N, &M))
{
for (int i=1; i<=N; i++)
scanf("%d", &a[i]);
build(1, N, 1);
// for (int i=1; i<=2*N-1; i++)
// printf("%d %d %d\n", v[i].l, v[i].r, v[i].max);
// printf("%d\n", query(1, 5, 1));
while (M--)
{
getchar();
scanf("%c", &ch);
scanf("%d%d", &n, &m);
if (ch == 'Q')
{
printf("%d\n", query(n, m, 1));
}
else
{
update(n, m, 1);
}
}
}
return 0;
}