标签:杭电 1754i hate it 线段树
5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5
5 6 5 9 这道题是用的线段树做的代码:#include<stdio.h> #define maxn 222222 int MAX[maxn << 2] ; int max(int x,int y) { return x > y ? x : y ; } #define lson l , m , rt << 1 //rt代表root,这里是rt*2 ; #define rson m+1 , r , rt << 1|1 //这里是rt*2+1 ; //把当前节点信息更新到父节点信息 void PushUp( int rt ) { MAX[rt] = max( MAX[rt << 1 ] , MAX[rt << 1|1 ]) ; } //建树 void Built(int l , int r , int rt) { if(l == r) { scanf("%d" , &MAX[rt] ) ; return ; } int m = ( l + r ) / 2 ; Built(lson) ; Built(rson) ; PushUp(rt) ; } //更新 void Update(int a , int b , int l , int r , int rt ) { if(l == r) { MAX[rt] = b ; return ; } int m = ( l + r ) / 2 ; if(a <= m) Update(a , b , lson ) ; else Update(a , b , rson ) ; PushUp( rt ) ; } //查询 int query(int a , int b , int l , int r ,int rt ) { if(a <= l && r <= b) return MAX[ rt ] ; int m = ( r + l ) / 2 ; int num = 0 ; if( a <= m ) num = max( num , query(a , b ,lson ) ) ; if(b > m) num = max( num , query(a , b , rson ) ) ; return num ; }
int main() { int N = 0 , M = 0 ; while(~scanf("%d%d" , &N , &M )) { Built(1 , N , 1) ; char w[2] ; int a , b ; while( M-- ) { scanf("%s%d%d" , w , &a , &b ); if(w[0] == ‘Q‘) printf("%d\n" , query(a , b , 1 , N , 1 )) ; else Update( a , b , 1, N ,1) ; } } return 0 ; }
标签:杭电 1754i hate it 线段树
原文地址:http://blog.csdn.net/bluedream1219/article/details/38020571