您的位置:首页 > 其它

hdu 1754 线段树模板题

2013-07-27 15:39 225 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>

#define maxn 230050
#define lson l,mid,u<<1
#define rson mid+1,r,u<<1|1
using namespace std;

const int INF = 0x3f3f3f;

int seg[maxn<<2];

int Push_UP(int u){
seg[u] = max(seg[u<<1],seg[u<<1|1]);  //****这个地方 u<<1|1 不能换为 u << 1 +1
}
void build(int l,int r,int u){
if(l == r){
scanf("%d",&seg[u]);
return;
}
int mid = (l + r)/2;
build(lson);
build(rson);
Push_UP(u);
}
void Update(int loc,int num,int l,int r,int u){
if(l == r){  // 这个地方要注意!!
seg[u] = num;
return;
}
int mid = (l + r)/2;
if(loc <= mid) Update(loc,num,lson);
else           Update(loc,num,rson);
Push_UP(u);
}
int Query(int L,int R,int l,int r,int u){
if(L <= l && r <= R){
return seg[u];
}
int ret = 0;
int mid = (l + r)/2;
if(L <= mid)    ret =max(ret,Query(L,R,lson));
if(R >  mid)    ret =max(ret,Query(L,R,rson));
return ret;
}
int main()
{
if(freopen("input.txt","r",stdin)== NULL)  {printf("Error\n"); exit(0);}
int N,M;
while(cin>>N>>M){
build(1,N,1);
while(M--){
char query[2];
int l,r;
scanf("%s%d%d",query,&l,&r);
if(query[0] == 'U')  Update(l,r,1,N,1);
else{
int ans = Query(l,r,1,N,1);
printf("%d\n",ans);
}
}
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: