Submission #1179853

#TimeUsernameProblemLanguageResultExecution timeMemory
1179853mariaclaraFood Court (JOI21_foodcourt)C++20
37 / 100
284 ms35124 KiB
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 1e6+5;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define mk make_pair 
#define fr first 
#define sc second

int n, m, q;
ll segP[MAXN], seg[MAXN], lazyP[MAXN];

void prop(int node, int leaf) {
    segP[node] += lazyP[node];

    if(!leaf) {
        lazyP[2*node] += lazyP[node];
        lazyP[2*node+1] += lazyP[node];
    }

    lazyP[node] = 0;
}

void updateP(int node, int l, int r, int p, int q, ll val) {
    prop(node, l == r);

    if(r < p or q < l) return;
    if(p <= l and r <= q) {
        lazyP[node] = val;
        prop(node, l == r);
        return;
    }

    int mid = (l+r)/2;
    updateP(2*node, l, mid, p, q, val);
    updateP(2*node+1, mid+1, r, p, q, val);
    segP[node] = min(segP[2*node], segP[2*node+1]);
}

void update(int node, int l, int r, int ind, ll val) {
    seg[node] += val;
    if(l == r) return;

    int mid = (l+r)/2;
    if(ind <= mid) update(2*node, l, mid, ind, val);
    else update(2*node+1, mid+1, r, ind, val);
}

ll queryP(int node, int l, int r, int p, int q) { // min segP 
    prop(node, l == r);
    if(q < l or r < p) return 1e18;
    if(p <= l and r <= q) return segP[node];
    int mid = (l+r)/2;
    return min(queryP(2*node, l, mid, p, q), queryP(2*node+1, mid+1, r, p, q));
}

ll query(int node, int l, int r, int p, int q) { // sum seg
    if(q < l or r < p) return 0;
    if(p <= l and r <= q) return seg[node];
    int mid = (l+r)/2;
    return query(2*node, l, mid, p, q) + query(2*node+1, mid+1, r, p, q);
}

int query_busca(int node, int l, int r, ll val) {
    if(l == r) return l;
    int mid = (l+r)/2;
    if(seg[2*node] >= val) return query_busca(2*node, l, mid, val);
    else return query_busca(2*node+1, mid+1, r, val - seg[2*node]);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m >> q;
    vector<int> t(q), c(q), ans(q), ls[n+1], Q[n+1];
    vector<ll> k(q);

    for(int i = 0, l, r; i < q; i++) {
        cin >> t[i];

        if(t[i] == 1) cin >> l >> r >> c[i] >> k[i];
        else if(t[i] == 2) cin >> l >> r >> k[i];
        else cin >> l >> k[i];

        if(t[i] == 3) Q[l].pb(i);
        else {
            ls[l].pb(i);
            if(r != n) ls[r+1].pb(-i-1);
        }
    }

    for(int i = 1; i <= n; i++) {
        for(auto it : ls[i]) {
            int C = 1;
            if(it < 0) it = -it-1, C = -1;
            if(t[it] == 1) {
                updateP(1, 0, q-1, it, q-1, C * k[it]);
                update(1, 0, q-1, it, C * k[it]);
            }
            else updateP(1, 0, q-1, it, q-1, C * -k[it]);
        }

        for(auto t3 : Q[i]) {
            int minP = min(queryP(1, 0, q-1, 0, t3), 0LL);
            int tot1 = query(1, 0, q-1, 0, t3);
            int pref3 = queryP(1, 0, q-1, t3, t3);
            int T = query_busca(1, 0, q-1, tot1 -pref3 + minP + k[t3]);
            if(T >= t3) ans[t3] = 0;
            else ans[t3] = c[T];
        }
    }

    for(int i = 0; i < q; i++)
        if(t[i] == 3) cout << ans[i] << "\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...