线段树新手wa求调95pts(挂在#19)
查看原帖
线段树新手wa求调95pts(挂在#19)
585704
TSL_ClearLightDream楼主2025/7/27 14:06
#include <bits/stdc++.h>
using namespace std;
int n,q,a[100001];
struct stree{
	int l,r;
	long long sum,pl;
}t[600000];
void add(int l,int r,long long pl,int pos)
{
	int mid=(t[pos].l+t[pos].r)>>1;
	if (l<=t[pos].l && r>=t[pos].r){
		t[pos].pl+=pl;
		return;
	}
	t[pos].sum+=(min(r,t[pos].r)-max(l,t[pos].l)+1)*pl;
	if (l<=mid){
		add(l,r,pl,pos<<1);
	}
	if (r>mid){
		add(l,r,pl,pos<<1|1);
	}
}
long long sum(int l,int r,int pos)
{
	if (t[pos].pl){
		t[pos].sum+=t[pos].pl*(t[pos].r-t[pos].l+1);
		if (t[pos].l!=t[pos].r){
			t[pos<<1].pl+=t[pos].pl;
			t[pos<<1|1].pl+=t[pos].pl;
		}
		t[pos].pl=0;
	}
	long long ans=0;
	int mid=(t[pos].l+t[pos].r)>>1;
	if (l<=t[pos].l && r>=t[pos].r){
		return t[pos].sum;
	}
	if (l<=mid){
		ans+=sum(l,r,pos<<1);
	}
	if (r>mid){
		ans+=sum(l,r,pos<<1|1);
	}
	return ans;
}
long long built(int l,int r,int pos)
{
	int mid=(l+r)>>1;
	t[pos].l=l;
	t[pos].r=r;
	if (l==r){
		t[pos].sum=a[l];
		return a[l];
	}
	t[pos].sum=built(l,mid,pos<<1)+built(mid+1,r,pos<<1|1);
	return t[pos].sum;
}
int main()
{
	cin>>n>>q;
	for (int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	built(1,n,1);
	for (int i=1;i<=q;i++){
		int k,l,r;
		scanf("%d%d%d",&k,&l,&r);
		if (k==2){
			printf("%lld\n",sum(l,r,1));
		}
		else {
			long long x;
			scanf("%lld",&x);
			add(l,r,x,1);
		}
	}
}
2025/7/27 14:06
加载中...