听说灌水区大佬多,线段树求调qwq
  • 板块灌水区
  • 楼主ycr_sad
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/7 10:23
  • 上次更新2023/11/2 22:29:23
查看原帖
听说灌水区大佬多,线段树求调qwq
764676
ycr_sad楼主2023/9/7 10:23

板子都过不了我真的太菜了qwq

#include<iostream>
using namespace std;
long long tree[400010],lzt[400010],a[100010];
int n,m;
void build(int u,int l,int r)
{
	if(l==r)
	{
		tree[u]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	tree[u]=tree[u*2]+tree[u*2+1];
}
bool in(int l,int r,int x,int y)
{
	return x<=l&&y>=r;
}
bool out(int l,int r,int x,int y)
{
	return l>=y||r<=x;
}
void mt(int u,int l,int r,int k)
{
	tree[u]+=(r-l+1)*k;
	lzt[u]+=k;
}
void pd(int u,int l,int r)
{
	if(!lzt[u])
	  return;
	int mid=(l+r)>>1;
	mt(u*2,l,mid,lzt[u]);
	mt(u*2+1,mid+1,r,lzt[u]);
	lzt[u]=0;
}
void add(int u,int l,int r,int x,int y,int k)
{
	if(in(l,r,x,y))
	{
		tree[u]+=(r-l+1)*k;
		lzt[u]+=k;
		return;
	}
	pd(u,l,r);
	if(out(l,r,x,y))
	  return;
	int mid=l+r>>1;
	add(u*2,l,mid,x,y,k);
	add(u*2+1,mid+1,r,x,y,k);
	tree[u]=tree[u*2]+tree[u*2+1]; 
}
int query(int u,int l,int r,int x,int y)
{
	if(in(l,r,x,y))
	  return tree[u];
	pd(u,l,r);
	if(out(l,r,x,y))
	  return 0;
	int mid=l+r>>1;
	return query(u*2,l,mid,x,y)+query(u*2+1,mid+1,r,x,y);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			add(1,1,n,x,y,k);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			cout<<query(1,1,n,x,y)<<"\n";
		}
	}
} 
2023/9/7 10:23
加载中...