线段树,求区间的最值,更新单点的值。
比较坑的是:
首先忘记了max的头文件,导致一直CE,
再次读字符前忘记吃掉空格,但是不知道为什么一直TE,文件读不到结尾,O__O"…。 板刷TLE, orz。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxx 200010
int sco[maxx<<2];
int n,k;
void find_max(int rt)
{
sco[rt]=max(sco[rt<<1],sco[rt<<1|1]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sco[rt]);
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
find_max(rt);
}
void change(int p,int ch,int l,int r,int rt)
{
if(l==r)
{
sco[rt]=ch;
return;
}
int m=(l+r)>>1;
if(p<=m)
change(p,ch,lson);
else
change(p,ch,rson);
find_max(rt);
}
int query(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return sco[rt];
int m=(l+r)>>1;
int ans=0;
if(left<=m)
{
ans=max(ans,query(left,right,lson));
}
if(right>m)
{
ans=max(ans,query(left,right,rson));
}
return ans;
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m)) {
build(1 , n , 1);
while (m --)
{
char c;
int a , b;
getchar();
scanf("%c%d%d",&c,&a,&b);
if (c== 'Q') printf("%d\n",query(a , b , 1 , n , 1));
else change(a , b , 1 , n , 1);
}
}
return 0;
}