不多说了,还是最基础的线段树,大家可以用这些题来入门线段树,最重要的是要有自己的build,query,update模板。
update: 单点替换
query: 寻求区间最大值
# include<cstdio>
# include<iostream>
# include<algorithm>
using namespace std;
# define lson l,m,rt<<1
# define rson m+1,r,rt<<1|1
const int maxn = 222222;
int MAX[maxn<<2];
void PushUP( int rt )
{//向上更新父节点
MAX[rt] = max( MAX[rt<<1],MAX[rt<<1|1] );
}
void build( int l,int r, int rt )
{//建树的过程
if ( r == l )
{
scanf("%d",&MAX[rt]);
return;
}
int m = (r+l)>>1;
build(lson);
build(rson);
PushUP(rt);
}
void update( int p,int sc, int l, int r,int rt )
{//单点更换
if ( l == r )
{
MAX[rt] = sc;
return;
}
int m = (l+r)>>1;
if ( p<=m )
update( p,sc,lson );
else
update( p,sc,rson );
PushUP(rt);
}
int query( int L,int R,int l,int r,int rt )
{//更新区间的最大值
if ( L<=l&&r<=R )
{
return MAX[rt];
}
int m = ( l+r )>>1;
int ret = 0;
if ( L<=m )
ret = max( ret,query(L,R,lson));
if ( R>m )
ret = max( ret,query(L,R,rson));
return ret;
}
int main(void)
{
int n,m;
while ( ~scanf("%d%d",&n,&m) )
{
build(1,n,1);
while( m-- )
{
char op[20];
int a,b;
scanf("%s%d%d",op,&a,&b);
if ( op[0] == 'Q' )
printf("%d\n",query(a,b,1,n,1));
else
update(a,b,1,n,1);
}
}
return 0;
}