您的位置:首页 > 其它

【HDOJ】【1754】I Hate It

2015-03-06 10:00 162 查看

线段树

  这是一道线段树的裸题……带单点修改的RMQ

  为什么我会想到写这么一道傻逼题呢?是因为这样……

//HDOJ 1754
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
#define CC(a,b) memset(a,b,sizeof(a))
using namespace std;
int getint(){
int v=0,sign=1; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();}
while(isdigit(ch))  {v=v*10+ch-'0'; ch=getchar();}
return v*sign;
}
const int N=200010,INF=~0u>>2;
const double eps=1e-8;
/*******************template********************/

int t[N<<2],n,m;
void update(int p,int v){
for(t[p+=n]=v,p>>=1;p;p>>=1)
t[p]=max(t[p+p],t[p+p^1]);
}
int ans;
void query(int l,int r){
for(l=l+n-1,r=r+n+1;l^r^1;l>>=1,r>>=1){
if (!(l&1)) ans=max(t[l^1],ans);
if ( r&1) ans=max(t[r^1],ans);
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
#endif
while(scanf("%d%d",&n,&m)!=EOF){
CC(t,0);
F(i,1,n) t[i+n]=getint();
D(i,n-1,1) t[i]=max(t[2*i],t[2*i+1]);//这句就是build建树……
char s[4];
int x,y;
F(i,1,m){
scanf("%s",s); x=getint(); y=getint();
if (s[0]=='Q') {ans=0; query(x,y); printf("%d\n",ans);}
if (s[0]=='U') update(x,y);
}
}
return 0;
}


zkw线段树(218MS 4296K)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: