这题T的我蛋疼··· 然后莫名其妙的A了····线段树 点修改区间查询的例题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include <algorithm>
//#define max(x,y) ((x)>(y)?(x):(y))
//#define min(x,y) ((x)<(y)?(x):(y))
#define ll long long
#define eps 1e-8
#define ms(x,y) (memset(x,y,sizeof(x)))
#define fr(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
/*线段树 点修改 区间最大值*/
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=222222;
int tree[maxn<<2];
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)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update(int p,int v,int l,int r,int rt)
{
if(l==r)
{
tree[rt]=v;
return ;
}
int m=(l+r)>>1;
if(p<=m)update(p,v,lson);
else update(p,v,rson);
pushup(rt);
}
int query(int ql,int qr,int l,int r,int rt)
{
if(ql<=l&&r<=qr)
{
return tree[rt];
}
int m=(l+r)>>1;
int ret=0;
if(ql<=m)ret=max(ret,query(ql,qr,lson));
if(qr>m)ret=max(ret,query(ql,qr,rson));
return ret ;
}
/*end-线段树 点修改 区间最大值*/
int n,M;
void init()
{
build(1,n,1);
}
void doit()
{
//cout<<"here"<<endl;
//getchar();
fr(i,1,M)
{
//cout<<i<<endl;
char op;
int x,y;
while(op=getchar(),op!='Q'&&op!='U');
scanf("%d%d",&x,&y);
//getchar();
if(op=='Q')
{
printf("%d\n",query(x,y,1,n,1));
}
else if(op=='U')
{
update(x,y,1,n,1);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&M))
{
init();
doit();
}
return 0;
}