线段树9pts求调
查看原帖
线段树9pts求调
1419923
ZYStream楼主2025/2/6 13:18

ACAC 了#1

#include<cstdio>
using namespace std;

typedef long long ll;
const ll N=100005;
ll n,q,a[N];
ll tr[N*10];

struct kd{
    ll k;
    ll d;
}tag[N*10];


void build(ll id,ll s,ll t){
    if (s==t){
        tr[id]=a[s];
        return ;
    }
    ll mid=s+t>>1;
    build(id<<1,s,mid);
    build(id<<1|1,mid+1,t);
    tr[id]=tr[id<<1]+tr[id<<1|1];
    return ;
}

void pd(ll id,ll s,ll t){
    ll l=id<<1,r=id<<1|1;
    ll mid=s+t>>1;
    if (tag[id].k&&s!=t){
        tag[l].k+=tag[id].k;
        tag[l].d+=tag[id].d;
        tag[r].k+=tag[id].k+(mid-s+1)*tag[id].d;
        tag[r].d+=tag[id].d;
        tr[l]+=(2*tag[l].k+(mid-s)*tag[l].d)*(mid-s+1)>>1;
        tr[r]+=(2*tag[r].k+(t-mid-1)*tag[r].d)*(t-mid)>>1;
        tag[id].k=0;
        tag[id].d=0;
    }
    return ;
}

void add(ll id,ll l,ll r,ll s,ll t,ll k,ll d){
    if (l<=s&&t<=r){
        tag[id].k+=(s-l)*d+k;
        tag[id].d+=d;
        tr[id]+=(2*tag[id].k+(t-s)*d)*(t-s+1)>>1;
        return ;
    }
    pd(id,s,t);
    ll mid=s+t>>1;
    if (l<=mid) add(id<<1,l,r,s,mid,k,d);
    if (r>mid) add(id<<1|1,l,r,mid+1,t,k,d);
    tr[id]=tr[id<<1|1]+tr[id<<1|1];
}

ll getans(ll id,ll p,ll s,ll t){
    if (s==t&&s==p){
        return tr[id];
    }
    pd(id,s,t);
    ll mid=s+t>>1;
    ll ans=0;
    if (p<=mid) ans=getans(id<<1,p,s,mid);
    else ans=getans(id<<1|1,p,mid+1,t);
    return ans;
}

int main(){
    freopen("P1438_2.in","r",stdin);
    scanf("%lld%lld",&n,&q);
    for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
    build(1,1,n);
    while (q--){
        ll opt;
        scanf("%lld",&opt);
        if (opt==1){
            ll l,r,k,d;
            scanf("%lld%lld%lld%lld",&l,&r,&k,&d);
            add(1,l,r,1,n,k,d);
        }
        else{
            ll p;
            scanf("%lld",&p);
            printf("%lld\n",getans(1,p,1,n));
        }
    }
    return 0;
}
2025/2/6 13:18
加载中...