多组输入。。。一开始眼瞎了没看见
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=524288; //这应该是最小区间数
int sum[maxn]; //存最值
int node[maxn/2];
void pushup(int rt) //求结点最值
{
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void bulid(int l,int r,int rt) //建树
{
if(l==r)
{
sum[rt]=node[l];
return ;
}
int m=(l+r)>>1;
bulid(l,m,rt<<1);
bulid(m+1,r,rt<<1|1);
//更新信息
pushup(rt);
}
// 改成绩 node[L]=c;
void update(int L,int c,int l,int r,int rt)
{
if(l==r) //到达叶节点,修改叶节点的值
{
sum[rt]=c;
return ;
}
int m=(l+r)>>1;
//根据条件判断往左子树调用还是往右
if(L<=m)
update(L,c,l,m,rt<<1);
else
update(L,c,m+1,r,rt<<1|1);
pushup(rt); //子节点的信息更新了,所以本节点也要更新信息
}
// 求 L~R 区间最值
int query(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R) //在区间内直接返回
return sum[rt];
int m=(l+r)>>1;
//更新最值
int ans=-1;
if(L<=m)
ans=max(ans,query(L,R,l,m,rt<<1)); //左子区间与[L,R]有重叠,递归
if(R>m)
ans=max(ans,query(L,R,m+1,r,rt<<1|1)); //右子区间与[L,R]有重叠,递归
return ans;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
scanf("%d",&node[i]);
bulid(1,n,1);
char ch;
int x,y;
for(int i=0;i<m;i++)
{
scanf(" %c%d%d",&ch,&x,&y);
if(ch=='Q')
printf("%d\n",query(x,y,1,n,1));
else
update(x,y,1,n,1);
}
}
return 0;
}
简单的模板题