线段树模板1求调 悬赏两关
  • 板块灌水区
  • 楼主Germany_XITELE
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/12/13 18:30
  • 上次更新2023/12/13 19:01:54
查看原帖
线段树模板1求调 悬赏两关
770008
Germany_XITELE楼主2023/12/13 18:30
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
ll sum[500000];
ll add[500000];
ll a[300000];
void change(ll l,ll r,ll k,ll d)
{ add[k]+=d;
  sum[k]+=(r-l+1)*d;
}
void pushdown(ll l,ll r,ll k)
{if(add[k])
	{ll mid=l+r>>1;
	 change(l,mid,k<<1,add[k]);
	 change(mid+1,r,k<<1|1,add[k]);
	 add[k]=0;
	}
}
void update(ll l,ll r,ll k,ll a,ll b,ll d)
{  ll mid=l+r>>1;
    if(a<=l&&b>=r)
    {sum[k]+=(l-r+1)*d;
      add[k]+=d;
      return;
	}
	pushdown(l,r,k);
	if(a<=mid)update(l,mid,k<<1,a,b,d);
	if(b>=mid+1)update(mid+1,r,k<<1|1,a,b,d);
	sum[k]=sum[k<<1]+sum[k<<1|1];
	return;
}
ll query(ll l,ll r,ll k,ll a,ll b)
{  if(a<=l&&b>=r)
   { 
     return sum[k];
   }
   ll mid=l+r>>1,res=0;
   pushdown(l,r,k);
   if(a<=mid)res+=query(l,mid,k<<1,a,b);
   if(b>=mid+1)res+=query(mid+1,r,k<<1|1,a,b);
  
   return res;
}
void build(ll l,ll r,ll k)
{  
   if(l==r)
   {
   sum[k]=a[l];
   return;
   }
    ll mid=l+r>>1;
	build(l,mid,k<<1);
	build(mid+1,r,k<<1|1);
	sum[k]=sum[k<<1]+sum[k<<1|1];
	return; 
}
int main()
{ ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
   
  while(m--)
  { ll op,a,b,k;
  	cin>>op;
  	 if(op==1)
  	 {
  	 	cin>>a>>b>>k;
  	 	 update(1,n,1,a,b,k);
	 }
     else
	 {  cin>>a>>b;
	 	cout<<query(1,n,1,a,b)<<'\n';
	 }
  }
  return 0;	
}
2023/12/13 18:30
加载中...