玄关求条40ptsWA
查看原帖
玄关求条40ptsWA
958732
DYF6friend楼主2024/11/1 20:43
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int dp[1000050],lazy[1000050],a[100050],n,q;
void build(int s,int t,int p)
{
	if (s==t)
	{
		dp[p]=a[s];
		return;
	}
	int m=s+((t-s)>>1);
	build(s,m,p*2);build(m+1,t,p*2+1);
	dp[p]=dp[p*2]+dp[p*2+1];
	return;
}
int find(int l,int r,int s,int t,int p)
{
	
	if (s>=l&&t<=r)return dp[p];
	int tmp=0;
	int m=s+((t-s)>>1);
	if (lazy[p])
	{
		dp[p*2]+=lazy[p]*(m-s+1);
		dp[p*2+1]+=lazy[p]*(t-m);
		lazy[p*2]+=lazy[p];
		lazy[p*2+1]+=lazy[p];
		lazy[p]=0; 
	}
	if (m>=l)tmp+=find(l,r,s,m,p*2);
	if (m<r)tmp+=find(l,r,m+1,t,p*2+1);
	return tmp;
}
void add(int l,int r,int s,int t,int p,int k)
{
	if (l<=s&&t<=r)
	{
		dp[p]+=k*(t-s+1);lazy[p]+=k;
		return;
	}
	int m=s+((t-s)>>1);
	if (lazy[p]&&s!=t)
	{
		dp[p*2]+=lazy[p]*(m-s+1);
		dp[p*2+1]+=lazy[p]*(t-m);
		lazy[p*2]+=lazy[p];
		lazy[p*2+1]+=lazy[p];
		lazy[p]=0; 
	}
	if (m>=l){add(l,r,s,m,p*2,k);}
	if (m<r){add(l,r,m+1,t,p*2+1,k);}
	dp[p]=dp[p*2]+dp[p*2+1];
	return;
}
void test(int s,int t,int p)
{
	int m=s+((t-s)>>1);
	if (s!=t)
	{
		test(s,m,p*2);
		test(m+1,t,p*2+1);
	}
	return;
}
signed main()
{
	cin>>n>>q;
	for (int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	for (int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		if (x==1)
		{
			int l,r,k;
			cin>>l>>r>>k;
			add(l,r,1,n,1,k);
		}
		if (x==2)
		{
			int l,r;
			cin>>l>>r;
			cout<<find(l,r,1,n,1)<<endl;
		}
	}
	return 0;
}
2024/11/1 20:43
加载中...