求助query
查看原帖
求助query
363669
hwwqy楼主2021/8/2 20:42
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1000005;
ll a[N],sum[N << 2], tag[N << 2];



void update(ll x) 
{
    sum[x] = sum[x << 1] + sum[x << 1 | 1];
}//更改这个节点的值 


void build(ll x, ll L, ll R) {
    if(L == R) {
        sum[x] = a[L];
        return;
    }
    ll mid = (L + R) >> 1;
    build(x << 1, L, mid);
    build(x << 1 | 1, mid + 1, R);
    update(x);
}//递归建树 



void pushdown(ll x, ll L, ll R) {
    if(tag[x] == 0) return;
    sum[x] += tag[x] * (R - L + 1);
    if(L != R) {
        tag[x << 1] += tag[x];
        tag[x << 1 | 1] += tag[x];
    }
    tag[x] = 0;
}//向下更新懒标记 




void modify(ll x, ll L, ll R, ll l, ll r, ll v) {
    pushdown(x, L, R);
    if(L <= l && R <= r) {
        tag[x] += v;
        pushdown(x, L, R);
        return;
    }
    ll mid = (L + R) >> 1;
    if(r <= mid) modify(x << 1, L, mid, l, r, v);
    else if(l > mid) modify(x << 1 | 1, mid+1, R, l, r, v);
    else{
        modify(x << 1, L, mid, l, mid, v);
        modify(x << 1 | 1, mid+1, R, mid+1, r, v);
    }
    update(x);
}
/*
a[l...r] += v
L,R变动
 
*/
ll query(ll x,ll L,ll R,ll l,ll r)
{
	ll res=0;
	if(L<=l&&r<=R)return sum[x];
	ll mid=(l+r)>>1;
	pushdown(x,l,r);
	if(l<=mid)res+=query(x<<1,L,mid,l,r);
	else res+=query(x<<1|1,mid+1,R,l,r);
	return res;
}

int main()
{
	ll n,m;
	scanf("%lld%lld",&n,&m);
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	int cmd,x,y,v;
	for(ll i=1;i<=m;i++)
	{
		scanf("%lld",&cmd);
		if(cmd==1)
		{
			scanf("%d%d%d",&x,&y,&v);
			modify(1,1,n,x,y,v);
		}
		else
		{
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,x,y,1,n));
		}
	}
    return 0;
}


应该就是query的问题kk

2021/8/2 20:42
加载中...