线段树入门题目,单点更改,区间查询。
AC代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#define lchild left,mid,root<<1
#define rchild mid+1,right,root<<1|1
using namespace std;
const int maxn = 200020;
int max_sc[maxn<<2];
//更新当前节点
void push_up(int root)
{
max_sc[root] = max(max_sc[root<<1],max_sc[root<<1|1]);
}
//构建线段树
void build(int left,int right,int root)
{
if(left == right)
{
scanf("%d",&max_sc[root]);
return;
}
int mid = (left+right)>>1;
build(lchild);
build(rchild);
push_up(root);
}
void update(int left,int right,int root,int a,int b)
{
if(left == right)
{
max_sc[root] = b;
return;
}
int mid = (left+right)>>1;
if(a<=mid) update(lchild,a,b);
else update(rchild,a,b);
push_up(root);
}
int Query(int left,int right,int root,int a,int b)
{
if(a<=left && right<=b)
{
return max_sc[root];
}
int mid = (left+right)>>1;
int ans = 0;
if(a<=mid) ans = max(ans,Query(lchild,a,b));
if(b>mid) ans = max(ans,Query(rchild,a,b));
return ans;
}
int main()
{
int n,m,a,b;
char op;
while(~scanf("%d%d",&n,&m))
{
build(1,n,1);
while(m--)
{
//注意吞空格的问题。
scanf(" %c %d%d",&op,&a,&b);
if(op == 'Q')
{
int ans = Query(1,n,1,a,b);
printf("%d\n",ans);
}
else
{
update(1,n,1,a,b);
}
}
}
return 0;
}