大佬们,0分求调,码风不好,勿喷
查看原帖
大佬们,0分求调,码风不好,勿喷
477737
quyy06楼主2022/10/5 16:36
#include<cstdio>
#define lol long long
using namespace std;
const int nn=1e5+5;
lol n,m,a[nn],tag1[nn<<2],tag2[nn<<2];
struct SegTree{
    lol l,r,w;
}seg[nn<<2];
inline bool isdigit(char s){return s>='0'&&s<='9'?true:false;}
inline lol read(){
    lol x=0,f=1;char s=getchar();
    while(!isdigit(s)){if(s=='-') f=-f;s=getchar();}
    while(isdigit(s)){x=(x<<1)+(x<<3)+s-'0';s=getchar();}
    return x*f;
}
inline lol dch(lol l,lol r,lol k,lol d){
    lol len=r-l+1;lol kn=k+d*(len-1ll);
    return 1ll*(k+kn)*len/2;
}
inline void push_up(lol x){seg[x].w=seg[x<<1].w+seg[x<<1|1].w;}
inline void make_tag(lol x,lol k,lol d){
    seg[x].w+=dch(seg[x].l,seg[x].r,k,d);
    tag1[x]+=k,tag2[x]+=d;
}
inline void build(lol x,lol l,lol r){
    seg[x].l=l;seg[x].r=r;
    if(l==r){
        seg[x].w+=1ll*a[l];
        return;
    }
    lol mid=(l+r)>>1;
    build(x<<1,l,mid);build(x<<1|1,mid+1,r);
    push_up(x);
}
inline void modify(lol x,lol l,lol r,lol k,lol d){
    if(seg[x].l>=l&&seg[x].r<=r){
        make_tag(x,(seg[x].l-l)*d+k,d);
        return;
    }
    if(seg[x].l==seg[x].r){
        tag1[x]=tag2[x]=0;
        return;
    }
    lol mid=(seg[x].l+seg[x].r)>>1;
    if(l<=mid) modify(x<<1,l,r,k,d);
    if(r>mid) modify(x<<1|1,l,r,k,d);
}
inline lol query(lol x,lol q){
    if(seg[x].l==seg[x].r) return seg[x].w;
    lol mid=(seg[x].l+seg[x].r)>>1;
    if(!tag1[x]||!tag2[x]){
        make_tag(x<<1,tag1[x],tag2[x]);
        make_tag(x<<1|1,tag1[x]+(mid+1-seg[x].l)*tag2[x],tag2[x]);
        tag1[x]=tag2[x]=0;
    }
    if(q<=mid) return query(x<<1,q);
    else return query(x<<1|1,q);
}
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    build(1,1,n);
    for(int i=1;i<=m;i++){
        lol opt=read();
        if(opt%2){
            lol l=read(),r=read(),k=read(),d=read();
            modify(1,l,r,k,d);
        }
        else printf("%lld\n",query(1,read()));
    }
    return 0;
}

2022/10/5 16:36
加载中...