由于自己做代码优化时,条件不清晰,两个变量写错导致WA了两次,不应该!
#include<iostream>
#include<cstdio>
#define MAXN 222222
using namespace std;
int tree[MAXN<<2];
int N,M;
void pushUp( int rt )
{
tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
void build( int l,int r,int rt )
{
if( l==r )
{
scanf( "%d",&tree[rt] );
return ;
}
int m=(l+r)/2;
build( l,m,rt<<1 );
build( m+1,r,rt<<1|1 );
pushUp(rt);
}
int query( int L,int R,int l,int r,int rt )
{
if( L<=l&&r<=R )
return tree[rt];
int m=(l+r)/2,ret=0;
if( m>=R )
return query( L,R,l,m,rt<<1 );
if( m+1<=L )
return query( L,R,m+1,r,rt<<1|1 );
ret=max(ret,query(L,R,l,m,rt<<1));
ret=max(ret,query(L,R,m+1,r,rt<<1|1));
return ret;
}
void update( int pt,int v,int l,int r,int rt )
{
if( l==r )
{
tree[rt]=v;
return ;
}
int m=(l+r)/2;
if( pt<=m )
update( pt,v,l,m,rt<<1 );
else
update( pt,v,m+1,r,rt<<1|1 );
pushUp(rt);
}
int main()
{
while( scanf("%d %d",&N,&M)!=EOF )
{
build( 1,N,1 );
char str[111];
gets(str);
while( M-- )
{
gets(str);
int n1,n2;
if( sscanf(str,"Q %d %d",&n1,&n2) )
printf( "%d\n",query(n1,n2,1,N,1) );
else if( sscanf(str,"U %d %d",&n1,&n2) )
update( n1,n2,1,N,1 );
}
}
return 0;
}