HDU 1754 I hate it 线段树的应用
#include<stdio.h> #define N_MAX 200010 typedef struct { int left,right; int maxScore; }seg_tree; seg_tree trees[N_MAX*4 +1]; int score[N_MAX+10]; int get_max(int x,int y){ return x>y?x:y; } void build_tree(int root,int left,int right) { trees[root].left = left; trees[root].right = right; if(left == right) { trees[root].maxScore = score[left]; return ; } int mid = (left + right)>>1; build_tree(root*2,left,mid); build_tree(root*2+1,mid+1,right); trees[root].maxScore = get_max(trees[root*2].maxScore,trees[root*2+1].maxScore); } int find_max(int root,int left,int right) { if(trees[root].left == left && trees[root].right == right ) { return trees[root].maxScore; } int mid = (trees[root].left + trees[root].right)>>1; if(right <= mid) { return find_max(root*2,left,right); } if(left > mid) { return find_max(root*2+1,left,right); } return get_max(find_max(root*2,left,mid),find_max(root*2+1,mid+1,right)); } void update(int root,int id,int new_value) { if(trees[root].left == trees[root].right) { trees[root].maxScore = new_value; return ; } int mid = (trees[root].left + trees[root].right)>>1; if(id <= mid) update(root*2,id, new_value); else update(root*2+1,id,new_value); trees[root].maxScore = get_max(trees[root*2].maxScore,trees[root*2+1].maxScore); } int main(void) { int N,M; while(scanf("%d %d",&N,&M) != EOF) { int i,j,k; char C; int A,B; for(i = 1;i<=N;i++) scanf("%d",&score[i]); build_tree(1,1,N); getchar(); for(i = 1;i<=M;i++) { scanf("%c",&C); if(C == 'Q') { scanf("%d %d",&A,&B); printf("%d\n",find_max(1,A,B)); } else{ scanf("%d %d",&A,&B); update(1,A,B); } getchar(); } } return 0; }
posted on 2011-05-22 22:01 lonelycatcher 阅读(169) 评论(0) 编辑 收藏 举报