Submission #1203008

#TimeUsernameProblemLanguageResultExecution timeMemory
1203008AvianshMonkey and Apple-trees (IZhO12_apple)C++17
100 / 100
258 ms196628 KiB
#include <bits/stdc++.h>

using namespace std;

//range set range sum query

struct node{
    int lef, rig;
    long long val;
};

struct lazySparseSegTree{
    node *st;
    int *laz;
    int n;
    int cr = 0;
    lazySparseSegTree(int nodes, int siz){
        //default is 0
        node def = {-1,-1,0};
        st = new node[nodes];
        laz = new int[nodes];
        fill(st,st+nodes,def);
        fill(laz,laz+nodes,-1);
        n=siz-1;
    }
    void makeKids(int ind, int l, int r){
        if(l==r){
            return;
        }
        if(st[ind].lef==-1){
            st[ind].lef=++cr;
        }
        if(st[ind].rig==-1){
            st[ind].rig=++cr;
        }
    }
    void pushDown(int ind, int l, int r){
        makeKids(ind,l,r);
        if(laz[ind]==-1)
            return;
        st[ind].val=1LL*(laz[ind])*(r-l+1);
        laz[st[ind].lef]=laz[ind];
        laz[st[ind].rig]=laz[ind];
        laz[ind]=-1;
    }

    void rupdate(int l, int r, int s, int e, int ind, int val){
        pushDown(ind,l,r);
        if(r<s||l>e)
            return;
        if(s<=l&&r<=e){
            laz[ind]=val;
            pushDown(ind,l,r);
            return;
        }
        int mid = (l+r)/2;
        rupdate(l,mid,s,e,st[ind].lef,val);
        rupdate(mid+1,r,s,e,st[ind].rig,val);
        st[ind].val=st[st[ind].lef].val+st[st[ind].rig].val;
    }

    void update(int l, int r, int val){
        rupdate(0,n,l,r,0,val);
    }

    long long rquery(int l, int r, int s, int e, int ind){
        if(r<s||l>e){
            return 0;
        }
        pushDown(ind,l,r);
        if(s<=l&&r<=e){
            return st[ind].val;
        }
        int mid = (l+r)/2;
        return rquery(l,mid,s,e,st[ind].lef)+rquery(mid+1,r,s,e,st[ind].rig);
    }

    long long query(int l, int r){
        return rquery(0,n,l,r,0);
    }
};

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int q;
    cin >> q;
    lazySparseSegTree lsst(1e7,1e9+5);
    int c = 0;
    while(q--){
        int d,l,r;
        cin >> d >> l >> r;
        l+=c;
        r+=c;
        if(d==1){
            c=lsst.query(l,r);
            cout << c << "\n";
        }
        else{
            lsst.update(l,r,1);
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...