洛谷-P3372-线段树 1(区间修改,区间求和)
程序员文章站
2022-07-15 12:01:58
...
题目链接
题意:
给你一个数组,对该数组进行区间修改和区间求和操作。
思路:
差分进行区间修改,再开一个数组对拆分后的数组求和。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=5e5+5;
const int inf=0x3f3f3f3f;
int n,m,sum2[N],sum1[N],arr[N];
int lowbit(int k)
{
return k&(-k);
}
void update(int p,int x)
{
for(int i=p;i<=n;i+=lowbit(i))
{
sum1[i]+=x;
sum2[i]+=x*p;
}
}
int getsum(int p)
{
int res=0;
for(int i=p;i;i-=lowbit(i))
{
res+=(p+1)*sum1[i]-sum2[i];
}
return res;
}
signed main()
{
IOS;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
update(i,arr[i]-arr[i-1]);
}
for(int i=1;i<=m;i++)
{
int a,l,r,x;
cin>>a;
if(a==1)
{
cin>>l>>r>>x;
update(l,x);
update(r+1,-x);
}
else
{
cin>>l>>r;
cout<<getsum(r)-getsum(l-1)<<endl;
}
}
return 0;
}