这道题题意很简单,显示是线段树单点更新,然后求某一区间的最大值。
啪啪两下敲完代码,各种wrong ,后来发现是分区间的时候没注意,粗心了,所以以后敲代码谨慎点,这样也可以节约调试的时间:
附上代码:备忘
#include <iostream>
#include <string.h>
#include <algorithm>
#define N 800100
using namespace std;
struct node
{
int v,l,r;
}st[N];
int a[N];
int ans;
int max(int a,int b)
{
return a>b?a:b;
}
void build(int v,int l,int r)
{
st[v].l=l;
st[v].r=r;
if(l==r)
{
st[v].v=a[l];
return;
}
int mid=(l+r)/2;
build(2*v,l,mid);
build(2*v+1,mid+1,r);
st[v].v=max(st[2*v].v,st[2*v+1].v);
}
void insert(int v,int w,int d)
{
if(st[v].l==w&&st[v].r==w)
{
st[v].v=d;
return;
}
int mid=(st[v].l+st[v].r)/2;
if(w<=mid)
insert(2*v,w,d);
else
insert(2*v+1,w,d);
st[v].v=max(st[v*2].v,st[v*2+1].v);
}
void query(int v,int l,int r)
{
if(st[v].l==l&&st[v].r==r)
{
ans=max(ans , st[v].v);
return;
}
int mid=(st[v].l+st[v].r)/2;
if(r<=mid)
query(2*v,l,r); //就因为这个区间的问题,费了好久调试
else if(l>mid)
query(2*v+1,l,r);
else
{
query(2*v,l,mid);
query(2*v+1,mid+1,r);
}
}
int main()
{
int n,m,i,x,y;
char ch[5];
while(scanf("%d%d",&n,&m)!=EOF){
memset(a,0,sizeof(a));
for(i=1;i<=n ;i++)
scanf("%d",&a[i]);
build(1,1,n);
while(m--){
scanf("%s%d%d",ch,&x,&y);
if(ch[0]=='U'){
insert(1,x,y);
}
if(ch[0]=='Q'){
ans=0;
query(1,x,y);
printf("%d\n",ans);
}
}
}
return 0;
}