输入包含多组测试数据。
每组输入第一行是两个正整数N和M(0<N<=30000,0<M<5000),分表代表学生的数目和操作的数目。
学生ID编号从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
接下来有M行。每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B。
当C为‘Q’的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r,f;int zhi;
}a[120001];
int n,m,b[30001],x,y,z;char u;
void build(int k,int l,int r)
{
a[k].l=l;a[k].r=r;
if(l==r)
{
a[k].zhi=b[l];
return;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
a[k].zhi=max(a[k*2].zhi,a[k*2+1].zhi);
}
void add(int k,int x,int zhi)
{
if(a[k].l==a[k].r)
{
a[k].zhi=zhi;
return;
}
int mid=(a[k].l+a[k].r)/2;
if(mid>=x)
{
add(k*2,x,zhi);
}
else
add(k*2+1,x,zhi);
a[k].zhi=max(a[k*2].zhi,a[k*2+1].zhi);
}
int find(int k,int l,int r)
{
if(a[k].l>=l&&a[k].r<=r)
{
return a[k].zhi;
}
int ans=-199009999,mid=(a[k].l+a[k].r)/2;
if(mid>=l)
{
ans=max(ans,find(k*2,l,r));
}
if(mid<r)
{
ans=max(ans,find(k*2+1,l,r));
}
return ans;
}
int main()
{
while(cin>>n>>m)
{
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
build(1,1,n);
for(int i=0;i<m;i++)
{
cin>>u;
if(u=='U')
{
cin>>x>>y;
add(1,x,y);
}
if(u=='Q')
{
cin>>x>>y;
cout<<find(1,x,y)<<endl;
}
}
}
}