MnZn刚学OI和线段树0.000114514秒,70分求助
查看原帖
MnZn刚学OI和线段树0.000114514秒,70分求助
164836
juruojjl_楼主2021/7/15 20:24
#include<bits/stdc++.h>
using namespace std;
long long a[1919810],d[1919810],temp[1919810];
long long n,m;
long long read()
{
	long long x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
void build(long long s,long long t,long long p)
{
	if(s==t)
	{
		d[p]=a[s];
		return;
	}
	long long mid=s+(t-s)/2;
	build(s,mid,p*2);
	build(mid+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
}
void addk(long long l,long long r,long long s,long long t,long long p,long long k)
{
	if(l<=s&&t<=r)
	{
		d[p]+=(t-s+1)*k,temp[p]+=k;
		return;
	}
	long long mid=s+(t-s)/2;
	if(temp[p])
	{
		d[p*2]+=(mid-s+1)*temp[p],d[p*2+1]+=(t-mid)*temp[p];
		temp[p*2]+=temp[p],temp[p*2+1]+=temp[p];
		temp[p]=0;
	}
	if(l<=mid) addk(l,r,s,mid,p*2,k);
	if(r>mid) addk(l,r,mid+1,t,p*2+1,k);
	d[p]=d[p*2]+d[p*2+1]; 
}
long long query(long long l,long long r,long long s,long long t,long long p)
{
	long long sum=0;
	if(l<=s&&t<=r) return d[p];
	long long mid=s+(t-s)/2;
	if(temp[p])
	{
		d[p*2]+=(mid-s+1)*temp[p],d[p*2+1]+=(t-mid)*temp[p];
		temp[p*2]+=temp[p],temp[p*2+1]+=temp[p];
		temp[p]=0;
	}
	if(l<=mid) sum=query(l,r,s,mid,p*2);
	if(r>mid) sum+=query(l,r,mid+1,t,p*2+1);
	return sum;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(long long i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	for(long long i=0;i<m;i++)
	{
		long long op,x,y;
		cin>>op>>x>>y;
		if(op==1)
		{
			long long k;
			cin>>k;
			addk(x,y,1,n,1,k);
		}
		if(op==2) printf("%d\n",query(x,y,1,n,1));
//		for(long long i=1;i<=20;i++) cout<<d[i]<<" ";
//		cout<<endl;
	}
}
2021/7/15 20:24
加载中...