这道题 最需要主意:将询问的最大值进行存储。每次进行更新的时候最大值也要更新。
由于一个细节没有处理好 还是wa了几次。
下面附上代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 200005
int a[N];
int max(int x,int y)
{
if(x>y)return x;
else return y;
}
struct node
{
int l;
int r;
int ma;
}t[N*4];
void make (int sl,int sr,int i)
{
t[i].l=sl;
t[i].r=sr;
if(sl==sr)
t[i].ma=a[sr];
else
{
int mid=(t[i].l+t[i].r)/2;
make (sl,mid,i*2);
make (mid+1,sr,i*2+1);
t[i].ma=max(t[i*2].ma,t[i*2+1].ma);
}
}
void update(int x,int val ,int i)
{
if(t[i].l==x&&t[i].r==x)
{
t[i].ma=val;
return ;
}
else if(t[i].l<t[i].r)
{
int mid=(t[i].l+t[i].r)/2;
if(x>mid)
update(x,val,i*2+1);
else
update(x,val,i*2);
t[i].ma=max(t[i*2].ma,t[i*2+1].ma);
}
}
int query(int st,int ed,int i)
{
if(st==t[i].l&&ed==t[i].r)
return t[i].ma;
else if(t[i].l<t[i].r)
{
int mid=(t[i].l+t[i].r)/2;
if(st>mid)
return query(st,ed,i*2+1);
else if(ed<=mid)
return query(st,ed,i*2);
else
{
return max(query(st,mid,i*2), query(mid+1,ed,i*2+1));
}
}
}
int main()
{
int n,m;
int i;
char str[3];
int start,end;
int x,val;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
make(1,n,1);
while(m--)
{
scanf("%s",str);
if(strcmp(str,"Q")==0)
{
scanf("%d %d",&start,&end);
printf("%d\n",query(start,end,1));
}
if(strcmp(str,"U")==0)
{
scanf("%d %d",&x,&val);
update(x,val,1);
}
}
}
return 0;
}