题意:
求指定区间的最大值。
这题目多组输入,scanf输入的时候一定要加EOF,不然会ole。
代码如下
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=200010;
typedef long long ll;
#define clr(a,b) memset(a,b,sizeof(a));
int segm[maxn<<2];
void pushup(int i)
{
segm[i]=max(segm[i<<1],segm[i<<1 | 1]);
}
void build(int root,int l ,int r)
{
if(l==r)
{
scanf("%d",&segm[root]);
return ;
}
int m=(l+r)/2;
build(root*2,l,m);
build(root*2+1,m+1,r);
pushup(root);
}
void update(int id ,int val,int i,int l ,int r)
{
if(l==r)
{
segm[i]=val;
return ;
}
int m=(l+r)/2;
if(id<=m)
update(id,val,i*2,l,m);
if(id>m)
update(id,val,i*2+1,m+1,r);
pushup(i);
}
int query(int ql,int qr,int i,int l,int r)
{
if(ql<=l && qr>=r)
return segm[i];
int m=(l+r)/2,ans=0;
if(ql<=m)
ans=max(ans,query(ql,qr,i*2,l,m));
if(qr>m)
ans=max(ans,query(ql,qr,i*2+1,m+1,r));
return ans;
}
int n,cas,x,y;
char ch[10];
int main()
{
while(scanf("%d%d",&n,&cas)!=EOF)
{
build(1,1,n);
while(cas--)
{
scanf("%s%d%d",ch,&x,&y);
if(ch[0]=='Q')
printf("%d\n",query(x,y,1,1,n));
if(ch[0]=='U')
update(x,y,1,1,n);
}
}
return 0;
}