题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1754
思路 : 比较简单的线段树,区间求最值,单点更新。
读入字符的时候,最好用字符数组保存,使用 %s读入,如果使用 %c 会T ..好像是会吃掉换行符。。
#include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 2000005
using namespace std;
int stu[maxn],n,m,a,b;
void create(int l,int r,int sum)
{
if(l==r) {scanf("%d",&stu[sum]);return ;}
int m=(l+r)>>1;
create(l,m,sum<<1);
create(m+1,r,sum<<1|1);
stu[sum]=max(stu[sum<<1],stu[sum<<1|1]);
}
int quary(int l,int r,int L,int R,int sum)
{
if(L>=l&&R<=r) return stu[sum];
int l1=0,r1=0;
int m=(L+R)>>1;
if(l<=m) l1=quary(l,r,L,m,sum<<1);
if(r>m) r1=quary(l,r,m+1,R,sum<<1|1);
return l1>r1?l1:r1;
}
void update(int l,int r,int sum,int id,int score)
{
if(l==r) {stu[sum]=score;return ;}
int m=(l+r)>>1;
if(id<=m) update(l,m,sum<<1,id,score);
else update(m+1,r,sum<<1|1,id,score);
stu[sum]=max(stu[sum<<1],stu[sum<<1|1]);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
create(1,n,1);
char sp[2];
while(m--)
{
scanf("%s%d%d",sp,&a,&b);
if(sp[0]=='Q')
printf("%d\n",quary(a,b,1,n,1));
else
update(1,n,1,a,b);
}
}
}