您的位置:首页 > 其它

HDU 1754 I Hate It(线段树单点更新)

2017-01-18 16:46 302 查看
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=800000+5;
int n,m,a[maxn/4];
struct Intervaltree{
int maxx[maxn];

void clear() {memset(maxx,0,sizeof(maxx));}

void build(int o,int L,int R)
{
if(L==R){
maxx[o]=a[L];
return ;
}
build(o*2+1,L,(L+R)/2);
build(o*2+2,(L+R)/2+1,R);
maxx[o]=max(maxx[o*2+1],maxx[o*2+2]);
}

void update(int o,int p,int L,int R,int v)
{
if(L==R){
maxx[o]=v;
return ;
}
int mid=(L+R)/2;
if(p<=mid) update(o*2+1,p,L,mid,v);
else update(o*2+2,p,mid+1,R,v);
maxx[o]=max(maxx[o*2+1],maxx[o*2+2]);
}

int query(int o,int l,int r,int L,int R)
{
int v=0;
if(L<=l&&R>=r) return maxx[o];
int mid=(l+r)/2;
if(R<=mid) v=max(v,query(o*2+1,l,mid,L,R));
else if(L>mid) v=max(v,query(o*2+2,mid+1,r,L,R));
else v=max(v,max(query(o*2+1,l,mid,L,R),query(o*2+2,mid+1,r,L,R)));
return v;
}
};
Intervaltree Interval;
int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
Interval.clear();
Interval.build(0,1,n);
char cmd[10];
while(m--)
{
scanf("%s",cmd);
int a,b;
scanf("%d%d",&a,&b);
if(cmd[0]=='Q'){
printf("%d\n",Interval.query(0,1,n,a,b));
}
else{
Interval.update(0,a,1,n,b);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: