LUOGU1438无聊的数列

区间加等差数列单点查询

思路:

差分,通过树状数组修改,然后保存两个数组,一个存公差,一个存和

然后正常操作即可

在学校潦草写的很潦草啦

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100010
using namespace std;
int a[MAXN][2],p[MAXN],n;
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int k,int d)
{
    while(x<=n)
    {
        a[x][0]+=k;
        a[x][1]+=d;
        k+=d*lowbit(x);
        x+=lowbit(x);
    }
}
int sum(int x)
{
    int ans=0,pos=x;
    while(pos)
    {
        ans+=a[pos][0]+(x-pos)*a[pos][1];
        pos-=lowbit(pos);
    }
    return ans;
}
int main()
{
    int x,i,l,r,k,d,s,m;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&p[i]);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&s);
        if(s==1)
        {
            scanf("%d%d%d%d",&l,&r,&k,&d);
            add(l,k,d);
            add(r+1,-k-(r-l+1)*d,-d);
        }
        else
        {
            scanf("%d",&x);
            printf("%d\n",p[x]+sum(x));
        }
    }
    return 0;
}

 

posted @ 2017-12-27 13:15  寒雨微凝  阅读(94)  评论(0编辑  收藏  举报