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;
}