HDU 1754 i hate it

来源:互联网 发布:天融信应届生工资 知乎 编辑:程序博客网 时间:2024/06/02 12:25

线段树问题。

看完STATISTICS的第一页有感:和高手比还是有差距啊!

/* * HDU 1754 i hate it * mike-w * 2011-8-14 * ---------------------- * hint: segment tree * PS:看来对线段树的IMPLEMENTATION还不是很熟悉, *    debug了十几分钟,鄙人coding委实有待加强 *    400+ms,高手门是140+ms :D */#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 200000#define L 0#define R 1#define BEST 2#define max(x,y) ((x)>(y)?(x):(y))int seg[MAXSIZE][3];int build(long r,long x1,long x2){seg[r][L]=x1;seg[r][R]=x2;seg[r][BEST]=0;long t=r<<1;if(x1==x2)return 0;else if(x2-x1==1){build(t,x1,x1);build(t+1,x2,x2);}else{long mid=(x1+x2)>>1;build(t,x1,mid);build(t+1,mid+1,x2);}return 0;}int update(long r,long id,long scr){long  mid=(seg[r][L]+seg[r][R])>>1,  t=r<<1;if(seg[r][L]==seg[r][R]){seg[r][BEST]=scr;return 0;}else if(id<=mid)update(t,id,scr);elseupdate(t+1,id,scr);seg[r][BEST]=max(seg[t][BEST],seg[t+1][BEST]);return 0;}int query(long r,long x1,long x2){long mid=(seg[r][L]+seg[r][R])>>1, t=r<<1;if(seg[r][L]==x1&&seg[r][R]==x2)return seg[r][BEST];else if(x2<=mid)return query(t,x1,x2);else if(x1>mid)return query(t+1,x1,x2);elsereturn max(query(t,x1,mid),query(t+1,mid+1,x2));}int main(void){long N,M,i;int tmp,arg1,arg2;char buf[5];#ifndef ONLINE_JUDGEfreopen("1754.in","r",stdin);#endifwhile(scanf("%ld%ld",&N,&M)!=EOF){build(1,1,N);for(i=1;i<=N;i++){scanf("%d",&tmp);update(1,i,tmp);}for(i=1;i<=M;i++){scanf("%s%d%d",buf,&arg1,&arg2);if(*buf=='Q')printf("%d\n",query(1,arg1,arg2));elseupdate(1,arg1,arg2);}}return 0;}


 

原创粉丝点击