Luogu 3368(树状数组)

来源:互联网 发布:网络教育学校有区别吗 编辑:程序博客网 时间:2024/05/18 02:26

传送门
树状数组区间修改单点查询(也可以套区间查询)模板题。

/*    pre_sum(n)=a[1]+a[2]+...+a[n]            =c[1]+(c[1]+c[2])+...+(c[1]+c[2]+...+c[n])            =n*(c[1]+c[2]+...+c[n])-(0*c[1]+1*c[2]+...+(n-1)*c[n])    令d[i]=(i-1)*c[i]    modify(l,r,+v):        add(c,l,v),add(c,r+1,-v),add(d,l,(l-1)*v),add(d,r+1,-r*v)    pre_sum(n)=n*query(c,n)-query(d,n)    sum(l,r)=pre_sum(r)-pre_sum(l-1)*/#include<bits/stdc++.h>using namespace std;const int MAXN=5e5+2;int n,m,c[MAXN],d[MAXN];inline int read() {    int x=0,f=1;char c=getchar();    while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}    while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();    return x*f;}inline void add(int *r,int pos,int v) {    for (int i=pos;i<=n;i+=(i&-i))        r[i]+=v;}inline int query(int *r,int pos) {    int ret=0;    for (int i=pos;i;i-=(i&-i))        ret+=r[i];    return ret;}int main() {//  freopen("P3368.in","r",stdin);    memset(c,0,sizeof(c)),    memset(d,0,sizeof(d));    n=read(),m=read();    for (register int i=1;i<=n;++i) {        int v=read();        add(c,i,v),add(c,i+1,-v),add(d,i,(i-1)*v),add(d,(i+1),-i*v);    }    for (register int i=1;i<=m;++i) {        int opt=read();        if (opt&1) {            int l=read(),r=read(),v=read();            add(c,l,v),add(c,r+1,-v),add(d,l,(l-1)*v),add(d,(r+1),-r*v);        }        else {            int pos=read(),l=pos-1,r=pos;            int t1=r*query(c,r)-query(d,r),t2=l*query(c,l)-query(d,l);            printf("%d\n",t1-t2);        }    }    return 0;}
原创粉丝点击