线段树10分求调
查看原帖
线段树10分求调
516468
_Give_up_楼主2022/8/3 19:44
#include<bits/stdc++.h>
#define N 2000010

using namespace std;

int read()
{
    int x = 0,f = 1;
    char c = getchar();
    while(c<'0' || c>'9')
	{
        if(c=='-') f = -1;
        c = getchar();
    }
    while(c>='0' && c<='9')
	{
        x = (x<<3)+(x<<1)+(c^48);
        c = getchar();
    }
    return x*f;
}

int a[N],z[N],t[N];

void build(int p,int l,int r)
{
	t[p] = 0;
	if (l==r)
	{
		z[p] = a[l];
		return;
	}
	int mid = (r+l)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	z[p] = z[p<<1]+z[p<<1|1];
}

void update(int x,int y,int l,int r,int k,int p)
{
	if (x<=l && y>=r)
	{
		z[p] += k*(r-l+1);
		t[p] += k;
		return;
	}
	int mid = (l+r)>>1;
	t[p<<1] += t[p];
	z[p<<1] += t[p]*(mid-l+1);
	t[p<<1|1] += t[p];
	z[p<<1|1] += t[p]*(r-mid-1);
	t[p] = 0;
	if (x<=mid) update(x,y,l,mid,k,p<<1);
	if (y>mid) update(x,y,mid+1,r,k,p<<1|1);
	z[p] = z[p<<1]+z[p<<1|1];
}

int query(int x,int y,int l,int r,int p)
{
	int ans = 0;
	if (x<=l && y>=r) return z[p];
	int mid = (l+r)>>1;
	t[p<<1] += t[p];
	z[p<<1] += t[p]*(mid-l+1);
	t[p<<1|1] += t[p];
	z[p<<1|1] += t[p]*(r-mid-1);
	t[p] = 0;
	if (x<=mid) ans += query(x,y,l,mid,p<<1);
	if (y>mid) ans += query(x,y,mid+1,r,p<<1|1);
	return ans;
}

int main()
{
	int n=read(),k=read();
	for (int i=1;i<=n;i++)
		a[i]=read();
	build(1,1,n);
	while(k--)
	{
		if (read()==1)
		{
			int x=read(),y=read(),k=read();
			update(x,y,1,n,k,1);
		}
		else
		{
			int x=read(),y=read();
			cout << query(x,y,1,n,1) << endl;
		}
	}
	return 0;
}

记录

2022/8/3 19:44
加载中...