OJ下最简单的一题线段树,但就是不知道为什么一直超时

OJ上最简单的一题线段树,但就是不知道为什么一直超时?
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1166

希望有人看看,我实在找不出来哪里错了。

我的代码:
C/C++ code
#include<iostream>
using namespace std;

#define lson l , m , root*2
#define rson m+1 , r , root*2+1

const 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;
}


------解决方案--------------------
我第一感觉是数据没清0。比如第一个数据是个完全二叉树,N=32768,第二个数据不满N=16385,那在算第二个数据的时候,sum末尾有一段是第二组数据计算的时候不用的,但是是非零的。
但说是说不用,你在PushUp的时候反而将那些算进去了。所以wa了。

不保证这是唯一的问题
------解决方案--------------------
你把cin和cout比scanf和printf慢,把cin,cout换成scanf,printf。
去掉宏定义,在调用里,直接写。