#include <cstdio>
#include <algorithm>
#include <cstdlib>
#define LS(x) (x<<1)
#define RS(x) (x<<1|1)
#define P(x) (x>>1)
#define MAXLEN 200005
#define PAUSE system("pause")
using namespace std;
int a[MAXLEN<<2];
int n;
void buildTree(int l, int r, int pos)
{
if(l == r)
{
scanf("%d", &a[pos]);
return;
}
int mid = (l+r)>>1;
buildTree(l, mid, LS(pos));
buildTree(mid+1, r, RS(pos));
a[pos] = max(a[LS(pos)], a[RS(pos)]);
}
int updata(int p, int l, int r, int v, int pos)
{
int mid;
do{
mid = (l+r)>>1;
if(mid >= p) { r = mid; pos = LS(pos); }
else { l = mid+1; pos = RS(pos); }
}while(l != r);
a[pos] = v;
do{
pos = P(pos);
a[pos] = max(a[LS(pos)], a[RS(pos)]);
}while(pos != 1);
}
int L, R;
int query(int l, int r, int pos)
{
if(L <= l && r <= R) return a[pos];
int amax = 0;
int mid = (l+r)>>1;
if(L <= mid) amax = max(amax, query(l, mid, LS(pos)));
if(R > mid) amax = max(amax, query(mid+1, r, RS(pos)));
return amax;
}
int main()
{
int q;
while(scanf("%d%d", &n, &q) != EOF)
{
buildTree(1, n, 1);
int a, b;
char ch;
while(q--)
{
scanf(" %c%d%d", &ch, &a, &b);
if(ch == 'Q')
{
L = a;
R = b;
printf("%d\n", query(1, n, 1));
}
else if(ch == 'U')
updata(a, 1, n, b, 1);
}
}
return 0;
}
hdoj 1754 【线段树】
最新推荐文章于 2019-08-09 20:14:34 发布