Submission #1296552

#TimeUsernameProblemLanguageResultExecution timeMemory
1296552viyeuquadamdauFood Court (JOI21_foodcourt)C++20
0 / 100
1097 ms30608 KiB
#pragma GCC optimize("O3")

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

#define int long long
#define ll long long
#define vec vector
#define PB push_back
#define all(x) x.begin(), x.end()
#define F first
#define S second
#define ull unsigned long long
#define pii pair<int, int>
#define rz resize
#define ld long double  
#define yes cout << "Yes\n"
#define no cout << "No\n"
#define matrix vec<vec<int>>
#define MP make_pair

const int N = 250004;
const int M = 2e14;
const int MAXN=1e7;
const ll INF = 1e18;
const ll mod = 1e9+7;

mt19937_64 rng(time(0));
int random(int a, int b) {return uniform_int_distribution<ll>(a,b)(rng);}

struct Fenwick
{
    vec<int> f;
    int n;
    Fenwick(int _n){
        n=_n;f.rz(n+5);
    }
    void upd(int x, int v){
        for(;x<=n;x+=x&-x)f[x]+=v;
    }
    void upd(int l, int r, int v){
        upd(l,v); upd(r+1,-v);
    }
    int quer(int x){
        int r=0;
        for(;x>0;x-=x&-x)r+=f[x]; return r;
    }
    int quer(int l, int r){
        return quer(r)-quer(l-1);
    }
};

struct SegmentTree
{
    vec<int>laz,st;
    int n;
    SegmentTree(int _n){
        n=_n;laz.rz(4*n+5);st.rz(4*n+5);
    }
    void pull(int id, int l, int r){
        if(!laz[id]) return ;
        st[id]+=laz[id];
        if(st[id]<0)st[id]=0;
        if(l!=r){
            laz[id<<1]+=laz[id];laz[id<<1|1]+=laz[id];
        }
        laz[id]=0;
    }

    void upd(int id, int l, int r, int cl, int cr, int x){
        pull(id,l,r);
        if(l > cr || r<cl)return;
        if(l >= cl && r<=cr){
            laz[id]+=x; pull(id,l,r); return ;
        }
        int m=(l+r)>>1;
        upd(id<<1,l,m,cl,cr,x);upd(id<<1|1,m+1,r,cl,cr,x);
    }

    void upd(int l, int r, int x){
        upd(1,1,n,l,r,x);
    }

    int quer(int id, int l, int r, int x){
        pull(id,l,r);
        if(l==r){
            return st[id];
        }
        int m=(l+r)>>1;
        if(m >= x) return quer(id<<1,l,m,x);
        return quer(id<<1|1,m+1,r,x);
    }

    int quer(int pos){
        return quer(1,1,n,pos);
    }
};

int type[N];
int L[N],R[N],C[N],K[N],A[N],B[N];
int n,m,q;

bool chk(int m, int a, int b){
    Fenwick f(n);
    for(int i=0;i<=m;++i){
        if(type[i]==1){
            f.upd(L[i],R[i],K[i]);
        }
    }
    // return 1;
    return (f.quer(a)>=b);
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    // freopen("CUTSEQ.INP","r",stdin);
    // freopen("CUTSEQ.out","w",stdout);

    cin>>n>>m>>q;
    Fenwick fen(n);
    SegmentTree seg(n);
    for(int i=0;i<q;++i){
        cin>>type[i];
        if(type[i]==1){
            cin >>L[i]>>R[i]>>C[i]>>K[i];
            fen.upd(L[i],R[i],K[i]);
            seg.upd(L[i],R[i],K[i]);
        } else if(type[i]==2){
            cin>>L[i]>>R[i]>>K[i];
            seg.upd(L[i],R[i],-K[i]);
        } else {
            cin>>A[i]>>B[i];
            B[i] += fen.quer(A[i])-seg.quer(A[i]);
        }
    }

    for(int i=0;i<q;++i){
        if(type[i]==3){
            int l=0,r=i-1;
            while(l<r){
                int m=(l+r)>>1;
                if(chk(m,A[i],B[i]))r=m; // > m
                else l=m+1;
            }
            cout<<C[r]<<'\n';
        }
    }


    cerr<<"ok!";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...