Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int const N=200000+6;
int n,m,a[N],maxn;
char s;
struct node
{
int l,r,sum;
} tree[N*4];
void biuld(int x,int y,int n)
{
tree[n].l=x;
tree[n].r=y;
if(x==y)
{
tree[n].sum=a[x];
return ;
}
int mid=(x+y)/2;
biuld(x,mid,2*n);
biuld(mid+1,y,2*n+1);
tree[n].sum=max(tree[n*2].sum,tree[n*2+1].sum);
}
void update(int x,int v,int n)
{
if(tree[n].l==x&&tree[n].r==x)
{
tree[n].sum=v;
return ;
}
int mid=(tree[n].l+tree[n].r)/2;
if(x<=mid)
{
update(x,v,2*n);
}
else
{
update(x,v,2*n+1);
}
tree[n].sum=max(tree[n*2].sum,tree[n*2+1].sum);
}
int query(int x,int y,int n)
{
int mid=(tree[n].l+tree[n].r)/2;
if(tree[n].l==x&&tree[n].r==y)
{
return tree[n].sum;
}
else if(x>mid)
{
return query(x,y,2*n+1);
}
else if(mid>=y)
{
return query(x,y,2*n);
}
else
{
return max(query(x,mid,2*n), query(mid+1,y,2*n+1));
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(tree,0,sizeof(tree));
int x,y;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
biuld(1,n,1);
while(m--)
{
getchar();
scanf("%c",&s);
maxn=0;
if(s=='Q')
{
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y,1));
}
else if(s=='U')
{
scanf("%d%d",&x,&y);
update(x,y,1);
}
}
}
return 0;
}