线段树功能:update:单点增减 query(求最大)区间最值
我发现如果输入改为cin >> 虽然简洁但是很不省时间直接超时了。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#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 maxx[maxn << 2];
void Push(int rt)
{
maxx[rt] = max(maxx[rt << 1] , maxx[rt << 1 | 1]);
}
void build(int l,int r,int rt)
{
if(l == r)
{
scanf("%d",&maxx[rt]);//cin >> maxx[rt],会超时的。
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
Push(rt);
}
void update(int op,int num,int l,int r,int rt)
{
if(l == r)
{
maxx[rt] = num;
return ;
}
int m = (l + r) >> 1;
if(op <= m)
update(op,num,lson);
else
update(op,num,rson);
Push(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L <= l && r <= R)
{
return maxx[rt];
}
int tmp = -1;
int m = (l + r) >> 1;
if(L <= m)
tmp = max(tmp , query(L,R,lson));
if(R > m)
tmp = max(tmp , query(L,R,rson));
return tmp;
}
int main()
{
int N,M,a,b;
while(~scanf("%d %d",&N,&M))
{
build(1,N,1);
while(M --){
char c[5];
scanf("%s %d %d",c,&a,&b);
if(c[0] == 'Q')
printf("%d\n",query(a,b,1,N,1));
else if(c[0] == 'U')
update(a,b,1,N,1);
}
}
return 0;
}