bzoj3155: Preprefix sum

是很像树上操作的那题的。

不写了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;

int n,m;
LL s[2][110000];
int lowbit(int x){return x&-x;}
void change(int w,int x,LL k)
{
    while(x<=n)
    {
        s[w][x]+=k;
        x+=lowbit(x);
    }
}
LL getsum(int w,int x)
{
    LL ret=0;
    while(x>=1)
    {
        ret+=s[w][x];
        x-=lowbit(x);
    }
    return ret;
}

LL a[110000];
char ss[20];
int main()
{
    scanf("%d%d",&n,&m);
    LL sum=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);sum+=a[i];
        change(0,i,sum);
    }
        
    int x;LL k;
    while(m--)
    {
        scanf("%s",ss+1);
        if(ss[1]=='Q')
        {
            scanf("%d",&x);
            printf("%lld\n",getsum(1,x)*x+getsum(0,x));
        }
        else
        {
            scanf("%d%lld",&x,&k);
            
            change(0,x, -LL((x-1)*(k-a[x])) ); 
            change(1,x,k-a[x]);
            a[x]=k;
        }
    }
    return 0;
}

 

posted @ 2018-03-03 14:58  AKCqhzdy  阅读(103)  评论(0编辑  收藏  举报