9分求调┬┬﹏┬┬
查看原帖
9分求调┬┬﹏┬┬
1435392
ZeroHead楼主2024/11/24 22:26
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e5+5;
int a[MAXN],n,m,ql,qr;
struct tree{
    int l,r,w,k,d,flag;
}t[4*MAXN+2];
void pushup(int u){
    t[u].w=t[u*2].w+t[u*2+1].w;
}
void build(int u,int l,int r){
    t[u].l=l;t[u].r=r;
    if(l==r){
        t[u].w=a[l];
        return;
    }
    int mid=l+r>>1;
    build(u*2,l,mid);
    build(u*2+1,mid+1,r);
    pushup(u);
}
int sum(int a1,int d,int len){
    int an=a1+(len-1)*d;
    return (a1+an)*len/2;
}
void maketag(int u,int k,int d){
    t[u].k+=k,t[u].d+=d;
    t[u].flag=1;
    t[u].w+=k;
}
void pushdown(int u){
    if(t[u].flag){
        maketag(u*2,t[u].k,t[u].d);
        maketag(u*2+1,t[u].k+(t[u*2+1].l-t[u*2].l)*t[u].d,t[u].d);
        t[u].flag=0,t[u].k=0,t[u].d=0;
    }
}
void update(int u,int l,int r,int k,int d){
    if(l<=t[u].l && r>=t[u].r){
        maketag(u,k,d);
        return;
    }
    pushdown(u);
    int mid=t[u].l+t[u].r>>1;
    if(l<=mid) update(u*2,l,r,k,d);
    if(r>mid) update(u*2+1,l,r,k+(mid+1-t[u].l)*d,d);
    pushup(u);  
}
int query(int u,int x){
    if(x==t[u].l && x==t[u].r) return t[u].w;
    pushdown(u);
    int mid=t[u].l+t[u].r>>1;
    int ans=0;
    if(x<=mid) ans+=query(u*2,x);
    if(x>mid) ans+=query(u*2+1,x);
    return ans;
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    while(m--){
        int opt;cin>>opt;
        if(opt==1){
            int k,d;cin>>ql>>qr>>k>>d;
            update(1,ql,qr,k,d);
        }
        else{
            int p;
            cin>>p;
            cout<<query(1,p)<<endl;
        }
    }
    return 0;
}
2024/11/24 22:26
加载中...