用树状数组解决敌兵布阵

#include   
#include   
#include   
#include   
  
int N;  
int T;  
int ar[50005];  
  
int lowb(int t)  
{  
    return t&(-t);  
}  
  
void add(int t,int v)  
{  
    for(int i=t;i<50005;i+=lowb(i))  
    {  
        ar[i]+=v;  
    }  
}  
  
int sum(int t)  
{  
    int s=0;  
    for( int i=t; i>0 ;i-=lowb(i))  
    {  
        s+=ar[i];  
    }  
    return s;  
}  

int main() 
{ 
    int T; 
    int w = 0; 
    scanf("%d", & T); 
    while(T--) 
    { 
        memset(ar, 0, sizeof(ar)); 
 
        int m; 
        int k; 
        int l, r; 
        char c[20]; 
        printf("Case "); 
        printf("%d", ++w); /// 之前答案错误是因为这里
        printf(":\n"); 
        scanf("%d", &m); 
 
 
 
        for(int i=1; i<=m; i++) 
        { 
            scanf("%d", &k); 
            add(i, k); 
        } 
        while(scanf("%s", c)) 
        { 
            if(strcmp(c, "End") == 0) ///时间超限是因为这里
                break; 

                scanf("%d%d", &l, &r); 
                if(strcmp(c, "Query") == 0) 
                { 
                    int m1 = sum(l-1); 
                    int m2 = sum(r); 
                    printf("%d\n",m2 - m1); 
                } 
                else if(strcmp(c, "Add") == 0) 
                    add(l, r); 
                else if(strcmp(c, "Sub") == 0) 
                    add(l, -r); 
             
 
        } 
 
 
    } 
    return 0; 
} 


 
 

你可能感兴趣的:(用树状数组解决敌兵布阵)