求调 树状数组区间修改区间查询
  • 板块学术版
  • 楼主Wang_Andy
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/10 20:49
  • 上次更新2024/5/10 21:00:06
查看原帖
求调 树状数组区间修改区间查询
773653
Wang_Andy楼主2024/5/10 20:49
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q,a[100005],sum1[100005],sum2[1000005];
int lowbit(int x)
{
	return x & -x;
}
void add(int x,int k,int t)
{
	if(x>n)return;
	sum1[x]+=k;
	sum2[x]+=t*k;
	add(x+lowbit(x),k,t);
}
int check(int x,int t,int s)
{
	if(x==0)return s;
	return check(x-lowbit(x),t,s+t*sum1[x]-sum2[x]);
}
main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		add(i,a[i]-a[i-1],i-1);
	}
	for(int i=1;i<=q;i++)
	{
		int f;
		cin>>f;
		if(f==1)
		{
			int l,r,x;
			cin>>l>>r>>x;
			add(l,x,l-1);
			add(r+1,-x,r);
		}
		else
		{
			int l,r;
			cin>>l>>r;
			cout<<check(r,r,0)-check(l-1,l-1,0)<<'\n';	
		}
	}
    return 0;
} 

//http://czoj.com.cn/p/P1320

2024/5/10 20:49
加载中...