线段树求调(悬两关)
  • 板块灌水区
  • 楼主aaa_kk
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/24 11:31
  • 上次更新2024/7/24 12:55:19
查看原帖
线段树求调(悬两关)
823921
aaa_kk楼主2024/7/24 11:31
#include<bits/stdc++.h>
using namespace std;

const long long N=1e6+10;
long long a[N],tr[N],lazy[N];
void push_up(long long rt)
{
	tr[rt]=tr[rt*2]+tr[rt*2+1];
}
void push_down(long long rt,long long l,long long r)
{
	if(lazy[rt]==0)return;
	long long mid=l+r>>1;
	lazy[rt*2]+=lazy[rt];
	lazy[rt*2+1]+=lazy[rt];
	lazy[rt*2]+=lazy[rt]*(mid-l+1);
	lazy[rt*2+1]+=lazy[rt]*(r-mid);
	lazy[rt]=0;
}
void bd(long long rt,long long l,long long r)
{
	lazy[rt]=0;
	if(l==r)
	{
		tr[rt]=a[l];
		return;
	}
	long long mid=l+r>>1;
	bd(rt*2,l,mid);
	bd(rt*2+1,mid+1,r);
	push_up(rt);
}
long long find(long long rt,long long l,long long r,long long ql,long long qr)
{
	if(ql<=l&&r<=qr)
	{
		return tr[rt];
	}
	long long mid=l+r>>1;
	push_down(rt,l,r);
	if(qr<=mid)return find(rt*2,l,mid,ql,qr);
	if(ql>mid)return find(rt*2+1,mid+1,r,ql,qr);
	return find(rt*2,l,mid,ql,qr)+find(rt*2+1,mid+1,r,ql,qr);
}
void update(long long rt,long long l,long long r,long long ql,long long qr,long long k)
{
	if(ql<=l&&r<=qr)
	{
		lazy[rt]+=k;
		tr[rt]+=k*(r-l+1);
		return;
	}
	long long mid=l+r>>1;
	push_down(rt,l,r);
	if(ql<=mid)update(rt*2,l,mid,ql,qr,k);
	if(qr>mid)update(rt*2+1,mid+1,r,ql,qr,k);
	push_up(rt);
}

int main()
{
	long long n,m;
	cin>>n>>m;
	for(long long i=1;i<=n;i++)
		cin>>a[i];
	bd(1,1,n);
	for(long long i=1;i<=m;i++)
	{
		long long op;
		cin>>op;
		if(op==1)
		{
			long long l,r,k;
			cin>>l>>r>>k;
			update(1,1,n,l,r,k);
		}
		else
		{
			long long l,r;
			cin>>l>>r;
			cout<<find(1,1,n,l,r)<<'\n';
		}
	}
	return 0;
}
2024/7/24 11:31
加载中...