OJ上最简单的一题线段树,但就是不知道为什么一直超时?
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1166
希望有人看看,我实在找不出来哪里错了。
我的代码:
#include<iostream>using namespace std;#define lson l , m , root*2#define rson m+1 , r , root*2+1const int maxn = 55555;int sum[maxn * 4];void PushUp ( int root ) { sum[root] = sum[ root * 2 ] + sum[ root * 2 + 1 ] ;}void build( int l , int r , int root ) { if( l == r ) { cin >> sum[root]; return ; } int m = ( l + r ) / 2 ; build (lson); build (rson); PushUp(root);}void update ( int p , int add , int l , int r , int root ){ if( l == r ) { sum[root] += add ; return ; } int m = ( l + r ) / 2 ; if ( p <= m ) update( p , add , lson ); else update( p , add , rson ); PushUp( root);}int query( int L , int R , int l , int r , int root){ if ( L <= l && R >= r ) return sum[root]; int m = ( l + r ) / 2 ; int ret = 0 ; if ( L <= m ) ret+=query(L , R , lson ); if ( R > m ) ret+= query( L, R , rson ); return ret ;}int main() { int T , n ; cin >> T ; for ( int cas = 1 ; cas <= T ; cas++ ){ cout << "Case " << cas << ":\n"; cin >> n ; build ( 1 , n , 1 ) ; char op[10] ; while ( cin >> op ) { if ( op[0] == 'E') break; int a , b ; cin >> a >> b ; if( op[0] =='Q' ) cout << query(a,b,1,n,1) << endl ; else if ( op[0] == 'S' ) update( a , -b , 1 , n , 1 ); else update( a, b, 1, n, 1 ); } } return 0;}