线段树求调
查看原帖
线段树求调
361773
lishenghao楼主2022/8/11 10:57
#include<bits/stdc++.h>
#define N 100001
#define ll long long
using namespace std;
int n,T;
ll sum[N<<2],a[N],lzy[N<<2];
void build(int pos,int l,int r)
{
	if(l==r)
	{
		sum[pos]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(pos<<1  ,l    ,mid);
	build(pos<<1|1,mid+1,r  );
}
void Add(int pos,int l,int r,int ad)
{
	lzy[pos]+=(ll)ad;
	sum[pos]+=(ll)(ad*(r-l+1));
}
void pd(int pos,int l,int r)
{
	int mid=l+r>>1;
	if(!lzy[pos])return;
	Add(pos<<1  ,l  ,mid,lzy[pos]);
	Add(pos<<1|1,mid,  r,lzy[pos]);
	lzy[pos]=0;
}
void modify(int pos,int l,int r,int ql,int qr,int ad)
{
	if(l>=ql&&r<=qr)
	{
		Add(pos,l,r,ad);
		return;
	}
	int mid=l+r>>1;
	pd(pos,l,r);
	if(ql<=mid)  modify(pos<<1  ,l    ,mid,ql,qr,ad);
	if(qr>=mid+1)modify(pos<<1|1,mid+1,r  ,ql,qr,ad);
	sum[pos]=sum[pos<<1]+sum[pos<<1|1];
}
ll query(int pos,int l,int r,int ql,int qr)
{
	if(l>=ql&&r<=qr) return sum[pos];
	int mid=l+r>>1;
	ll res=0;
	pd(pos,l,r);
	if(ql<=mid)  res+=query(pos<<1  ,l    ,mid,ql,qr);
	if(qr>=mid+1)res+=query(pos<<1|1,mid+1,r  ,ql,qr);
	return res;
}
int main()
{
	short opt;
	int l,r,k,i;
	cin>>n>>T;
	for(i=1; i<=n; i++)
		cin>>a[i];
	build(1,1,n);
	while(T--)
	{
		cin>>opt>>l>>r;
		if(opt&1)
		{
			cin>>k;
			modify(1,1,n,l,r,k);
		}
		else printf("%lld\n",query(1,1,n,l,r));
	}
}

全WA,样例过了

2022/8/11 10:57
加载中...