0分求助(我是一个刚学线段树德蒟蒻)
查看原帖
0分求助(我是一个刚学线段树德蒟蒻)
228451
he1234QWQ楼主2021/2/2 14:30
#include<bits/stdc++.h>
using namespace std;
long long t[500000],a[500000],lan[500000];
void fl(int x,int l,int r)
{
	if(lan[x]==0) return ;
	int val=lan[x],mid=(l+r)/2;
	lan[x*2]+=val,t[x*2]+=(mid-l+1)*val;
	lan[x*2+1]+=val,t[x*2+1]+=(r-mid)*val;
	lan[x]=0;
}
void f(int x,int l,int r)
{
		if(l==r)
		{
			t[x]=a[l];
			return ;
		}
		int mid=(l+r)/2;
		f(x*2,l,mid);
		f(x*2+1,mid+1,r);
		t[x]=t[x*2]+t[x*2+1];
}
int sum(int x,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)
	return t[x];
	long long ans=0;
	int mid=(l+r)/2;
	fl(x,l,r);
	if(L<=mid)
	ans+=sum(x*2,l,mid,L,R);
	if(mid<R)
	ans+=sum(x*2+1,mid+1,r,L,R);
	return ans;
}

void f3(int x,int l,int r,int L,int R,int v)
{
	if(L<=l&&r<=R){
		lan[x]+=v;
		t[x]+=(r-l+1)*v;
		return ;
	}
	fl(x,l,r);
	int mid=(l+r)/2;
	if(L<=mid) f3(x*2,l,mid,L,R,v);
	if(mid<R) f3(x*2+1,mid+1,r,L,R,v);
}
int n,m;
void print()
{
    int j=1,t2=1;
    for(int i=1; i<=(n<<2); i++)
    {
        j++;
        printf("%lld ",t[i]);
        if(j>pow(2,(t2-1)))
        {
            printf("\n");
            j=1;
            t2++;
        }

    }
    printf("\n\n");
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	f(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int p;
		scanf("%d",&p);
		if(p==1)
		{
			int u,v,w;
			cin>>w>>u>>v;
			f3(1,1,n,w,u,v);
			print();
		}
			else
			{
				int u,v;
				cin>>u>>v;
				cout<<sum(1,1,n,u,v)<<endl;
			}
		
	}
	return 0;
}
2021/2/2 14:30
加载中...