ツリー配列区間和(区間平均値)を求める


1658: O__O"…その中国語題Time Limit:1 Sec Memory Limit:128 MB
[Submit][Status][Web Board] Description
ある日、ある人がデータのセットを得て、困ったことに、ある同級生はいつもある区間[L,r]の範囲の平均値(整数部分だけ)==を尋ねた.誰かが解決できず、助けを求め、
Input
複数のテストのグループをファイルの最後に処理します.1行にn,m(n,m<=10000000)、次の行にnの数字(各数は200以下).
次にm行、各行は2つの数L、Rである.
Output
答えを出力します.
Sample Input
5 4 1 2 3 4 5 1 1 1 2 1 5 2 4
Sample Output
1 1 3 3
HINT
Source ACコード~:
    #include 
    #include 
    using namespace std;
    int a[100005],n,m;
    int lowbit(int x)
    {
        return x&-x;
    }
    int getSum(int y)// y 
    {
        int sum = 0;
        for(int i = y; i > 0; i-=lowbit(i))
            sum += a[i];
        return sum;
    }
    void update(int x,int y)// 
    {
        for(int j = x; j <= n; j+=lowbit(j))
            a[j] += y;
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            fill(a,a+n+1,0);
            int num;
            /*
            a[i] , 
             
            */
            for(int i = 1; i <= n; i++)
                {
                    scanf("%d",&num);
                    update(i,num);
                }
            int L,R,aver,t;
            while(m--)
            {
                scanf("%d%d",&L,&R);
                R>L?(t=0):(t=L,L=R,R=t);
                aver = (getSum(R)-getSum(L-1))/(R-L+1);
                printf("%d
"
,aver); } } return 0; } /* : , */