萌新刚学线段树,不知道为什么RE了qwq求指教
查看原帖
萌新刚学线段树,不知道为什么RE了qwq求指教
93731
闻染楼主2020/8/21 10:45

RT

#include <bits/stdc++.h>
using namespace std;

#define RE register
#define ll long long 
#define maxn 100010

ll f[maxn<<2],tag[maxn<<2],a[maxn];
ll n,m,x,y,v;

inline void fread(ll &x){
    x=0;
    int f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    x*=f;
}

inline ll ls(ll x){return x<<1;}

inline ll rs(ll x){return x<<1|1;}

inline void add(ll k,ll l,ll r,ll v){
    tag[k]+=v;
    f[k]+=v*(r-l+1);
}

inline void push_tag(ll k,ll l,ll r){
    ll v=tag[k];
    if(v==0)return;
    ll mid=(l+r)>>1;
    add(ls(k),l,mid,v);
    add(rs(k),mid+1,r,v);
    tag[k]=0;
}

inline void build(ll k,ll l,ll r){
    tag[k]=0;
    if(l==r){
        f[k]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(ls(k),l,mid);
    build(rs(k),mid+1,r);
    f[k]=f[ls(k)]+f[rs(k)];
}

inline void update(ll k,ll l,ll r,ll x,ll y,ll v){
    if(x<=l&&y>=r){
        tag[k]+=v;
        f[k]+=v*(r-l+1);
    }
    ll mid=(l+r)>>1;
    push_tag(k,l,r);
    if(x<=mid)update(ls(k),l,mid,x,y,v);
    if(y>mid)update(rs(k),mid+1,r,x,y,v);
    f[k]=f[ls(k)]+f[rs(k)];
}

inline ll ask(ll k,ll l,ll r,ll x,ll y){
    if(x<=l&&y>=r){
        return f[k];
    }
    ll ans=0;
    ll mid=(l+r)>>1;
    push_tag(k,l,r);
    if(x<=mid)ans+=ask(ls(k),l,mid,x,y);
    if(y>mid)ans+=ask(rs(k),mid+1,r,x,y);
    return ans;
}

int main(){
    fread(n);
    fread(m);
    for(RE int i=1;i<=n;i++)fread(a[i]);
    build(1,1,n);
    for(RE int i=1;i<=m;i++){
        ll t;
        fread(t);
        if(t==1){
            fread(x);
            fread(y);
            fread(v);
            update(1,1,n,x,y,v);
        }else if(t==2){
            fread(x);
            fread(y);
            printf("%lld\n",ask(1,1,n,x,y));
        }
    }
    return 0;
}
2020/8/21 10:45
加载中...