传送门:点击打开链接
题目大意:
线段树入门题。
两种操作:
1. 区间查询最大值。
2. 单点修改。
#include <cstdio>
#define maxn 200010
struct Node
{
int l,r,ma;
}tree[maxn<<2];
inline int max(int a,int b)
{
return a>b?a:b;
}
inline void pushup(int id)
{
tree[id].ma = max(tree[id<<1].ma,tree[id<<1|1].ma);
}
void build(int id,int l,int r)
{
tree[id].l = l;
tree[id].r = r;
if(l == r)
{
int x;
scanf("%d",&x);
tree[id].ma = x;
return;
}
int mid = (l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
pushup(id);
}
int query(int id,int l,int r)
{
if(tree[id].l >= l && tree[id].r <= r)
{
return tree[id].ma;
}
int mid = (tree[id].l+tree[id].r )>>1;
int res = 0x80808080;
if(l <= mid)
res = max(res,query(id<<1,l,r));
if(r > mid)
res = max(res,query(id<<1|1,l,r));
return res;
}
void update(int id,int pos,int x)
{
if(tree[id].l == tree[id].r)
{
tree[id].ma = x;
return;
}
int mid = (tree[id].l + tree[id].r)>>1;
if(pos <= mid)
update(id<<1,pos,x);
else
update(id<<1|1,pos,x);
pushup(id);
}
int main()
{
int n,m;
while(scanf("%d %d",&n,&m) != EOF)
{
build(1,1,n);
while(m--)
{
char a[10];
scanf("%s",a);
if(a[0] == 'Q')
{
int l,r;
scanf("%d %d",&l,&r);
printf("%d\n",query(1,l,r));
}
else
{
int pos,x;
scanf("%d %d",&pos,&x);
update(1,pos,x);
}
}
}
return 0;
}