제출 #386552

#제출 시각아이디문제언어결과실행 시간메모리
386552PurpleCrayon푸드 코트 (JOI21_foodcourt)C++17
100 / 100
850 ms47820 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define sz(v) int(v.size())
#define ar array
const int MAXN = 2.5e5+10, MAXQ = 2.5e5+10, MAXL = 18;
const ll INF = 1e18;

struct Beats {
    int n;
    void init(int _n){ n=_n; }

    struct info {
        ll lzy_ad=0, lzy_mx=-INF, lzy_ad2=0;
    } t[4*MAXN];

    void push(int v, int tl, int tr){
        if (tl == tr) return;

        t[2*v].lzy_ad += t[v].lzy_ad;
        t[2*v+1].lzy_ad += t[v].lzy_ad;
        t[2*v].lzy_mx += t[v].lzy_ad;
        t[2*v+1].lzy_mx += t[v].lzy_ad;

        t[2*v].lzy_mx = max(t[2*v].lzy_mx, t[v].lzy_mx);
        t[2*v+1].lzy_mx = max(t[2*v+1].lzy_mx, t[v].lzy_mx);

        t[2*v].lzy_ad2 += t[v].lzy_ad2;
        t[2*v+1].lzy_ad2 += t[v].lzy_ad2;

        t[v].lzy_ad = t[v].lzy_ad2 = 0, t[v].lzy_mx = -INF;
    }
    void upd(int v, int tl, int tr, int l, int r, ll val){
        push(v, tl, tr);
        if (l <= tl && tr <= r) {
            t[v].lzy_ad += val, t[v].lzy_mx += val;
            if (val > 0) t[v].lzy_ad2 += val;
            return;
        }
        int tm=(tl+tr)/2;
        if (l <= tm)
            upd(2*v, tl, tm, l, r, val);
        if (r > tm)
            upd(2*v+1, tm+1, tr, l, r, val);
    }
    ll qry(int v, int tl, int tr, int pos){
        push(v, tl, tr);
        if (tl == tr){
            return t[v].lzy_ad2 - max(t[v].lzy_ad, t[v].lzy_mx);
        }
        int tm=(tl+tr)/2;
        if (pos <= tm) return qry(2*v, tl, tm, pos);
        else return qry(2*v+1, tm+1, tr, pos);
    }

    void ad(int l, int r, ll val){ upd(1, 0, n-1, l, r, val); }
    void fix(){ t[1].lzy_mx = max(t[1].lzy_mx, 0ll); }
    ll qry(int i){ return qry(1, 0, n-1, i); }
} bst;

struct FT {
    int n;
    ll bit[MAXN];

    void init(int _n){ n=_n+10; memset(bit, 0, sizeof(bit)); }
    void add(int idx, ll val) {
        for (++idx; idx < n; idx += idx & -idx)
            bit[idx] += val;
    }
    void upd(int l, int r, ll val) {
        add(l, val);
        add(r+1, -val);
    }
    ll qry(int idx) {
        ll ret = 0;
        for (++idx; idx > 0; idx -= idx & -idx)
            ret += bit[idx];
        return ret;
    }
} st;

int n, m, q, bl[MAXQ], br[MAXQ];
ar<ll, 2> qv[MAXQ];
ar<ll, 4> qu[MAXQ];
vector<int> check[MAXQ];

int main(){
    ios::sync_with_stdio(false); cin.tie(0);
    cin >> n >> m >> q;
    
    bst.init(n);

    fill(qv, qv+q, ar<ll, 2>{-1, -1});
    fill(qu, qu+q, ar<ll, 4>{-1, -1, -1, -1});
    for (int qt = 0; qt < q; qt++){
        int ty; cin >> ty;

        if (ty == 1){ //add
            int l, r, c; ll k; cin >> l >> r >> c >> k, --l, --r;
            qu[qt] = {l, r, c, k};
            bst.ad(l, r, k);
        } else if (ty == 2){ //remove
            int l, r; ll val; cin >> l >> r >> val, --l, --r;
            bst.ad(l, r, -val);
            bst.fix();
        } else if (ty == 3){ //qry
            int i; ll v; cin >> i >> v, --i;
            qv[qt] = {i, bst.qry(i)+v};
        } else assert(false);
    }
    
    //for (int i = 0; i < q; i++) if (qv[i][0] != -1) cerr << qv[i][0] << ' ' << qv[i][1] << endl;

    fill(bl, bl+q, -1);
    fill(br, br+q, q);
    for (int rep = 0; rep < MAXL; rep++){
        st.init(n);
        for (int i = 0; i < q; i++) if (qv[i][0] != -1) {
            int mid = (bl[i]+br[i])/2;
            if (bl[i] < mid && mid < br[i])
                check[mid].push_back(i);
        }
        for (int i = 0; i < q; i++) {
            if (qu[i][0] != -1)
                st.upd(qu[i][0], qu[i][1], qu[i][3]);
            for (int v : check[i]) {
                if (st.qry(qv[v][0]) >= qv[v][1]) {
                    br[v] = i;
                } else {
                    bl[v] = i;
                }
            }
            vector<int>().swap(check[i]);
        } 
    }
    for (int i = 0; i < q; i++) if (qv[i][0] != -1) {
        int ca = br[i];
        cout << (ca>=i?0:qu[ca][2]) << '\n';
    }
}
#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...