【ybtoj】【树状数组】区间修改区间查询

题意

解析

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f,N = 1e6+10;
ll c[2][N];
int n,q;
int tmp;
void update(int x,int y)
{
	for(int i=x;i<=n;i+=i&-i)
	{
		c[0][i]+=y;//d[i]
		c[1][i]+=(ll)y*x;//d[i]*i注意+=y*x不是y*i 
	}
}
inline ll ask(int x)
{
	ll sum=0;
	for(int i=x;i;i-=i&-i)
	{
		sum+=c[0][i]*(x+1)-c[1][i];
	}
	return sum;
}
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		update(i,x-tmp);
		tmp=x;
	}
	for(int i=1;i<=q;i++)
	{
		int l,r,x,opt;
		scanf("%d%d%d",&opt,&l,&r);
		if(opt==1) 
		{
			scanf("%d",&x);
			update(l,x);
			update(r+1,-x);
		}
		else
		{
			ll ans=ask(r)-ask(l-1);
			printf("%lld\n",ans);
		}
	}
	return 0;
}

 

posted @ 2021-07-26 10:36  conprour  阅读(52)  评论(0编辑  收藏  举报