很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
在每个测试的第一行,有两个正整数 N 和 M ( 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAXN 800010
struct node
{
int r,l,nsum;
}t[MAXN];
int n,m,ans;
int num1[MAXN];
int max(int a,int b)
{
return a > b ? a : b;
}
void build(int l, int r, int i)//建立线段树
{
t[i].l = l;
t[i].r = r;
if(l == r)
{
t[i].nsum = num1[l];
return ;
}
int mid = (l+r)/2;
build(l, mid, i*2);
build(mid+1, r, i*2+1);
t[i].nsum = max(t[i*2].nsum, t[i*2+1].nsum);
}
void update(int x, int c, int i)//在x位置上更新成c
{
if (t[i].l == t[i].r)
{
t[i].nsum = c;
return ;
}
int mid = (t[i].l+t[i].r)/2;
if(x > mid)
update(x, c, i*2+1);
else
update(x, c, i*2);
t[i].nsum = max(t[i*2].nsum, t[i*2+1].nsum);
}
void query(int l, int r, int i)//查找该区间上的最大值
{
if(t[i].l == l && t[i].r == r)
{
ans = max(ans, t[i].nsum);
return ;
}
int mid = (t[i].l+t[i].r)/2;
if(l > mid)
query(l, r, i*2+1);
else if(r <= mid)
query(l, r, i*2);
else
{
query(l, mid, i*2);
query(mid+1, r, i*2+1);
}
}
int main()
{
char ch;
int x,y;
while(~scanf("%d%d",&n,&m))
{
for(int i=1; i<=n; i++)
{
scanf("%d",&num1[i]);
}
build(1, n, 1);
while(m--)
{
getchar();
scanf("%c%d%d",&ch,&x,&y);
if(ch == 'U')
{
update(x, y, 1);
}
else if(ch == 'Q')
{
ans = -99999;
query(x, y, 1);
printf("%d\n",ans);
}
}
}
return 0;
}