Submission #1352374

#TimeUsernameProblemLanguageResultExecution timeMemory
1352374nguyenkhangninh99New Home (APIO18_new_home)C++20
0 / 100
1927 ms113760 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 3e5 + 5, inf = 2e9;
priority_queue<int, vector<int>, greater<int>> cur[maxn], del[maxn];
multiset<int> s[maxn];
int st[4 * maxn];

void update(int id, int l, int r, int p){
    if(l == r){
        while(del[p].size() && cur[p].top() == del[p].top()) cur[p].pop(), del[p].pop();
        st[id] = (cur[p].empty() ? inf : cur[p].top());
    }else{
        int mid = (l + r) / 2;
        if(p <= mid) update(id * 2, l, mid, p);
        else update(id * 2 + 1, mid + 1, r, p);
        st[id] = min(st[id * 2], st[id * 2 + 1]); 
    }
}
int query(int id, int l, int r, int u, int v){
    if(v < l || r < u) return inf;
    if(u <= l && r <= v) return st[id];
    int mid = (l + r) / 2;
    return min(query(id * 2, l, mid, u, v), query(id * 2 + 1, mid + 1, r, u, v));
}
void solve(){
    int n, k, q; cin >> n >> k >> q;

    vector<array<int, 4>> qry;
    vector<int> cmp;
    for(int i = 1; i <= n; i++){
        int x, t, a, b; cin >> x >> t >> a >> b; //a,b = time. x = vị trí. t = loại    
        cmp.push_back(x);
        qry.push_back({a, -2, x, t});
        qry.push_back({b + 1, -1, x, t});
    }

    for(int i = 1; i <= q; i++){
        int l, x; cin >> l >> x;
        qry.push_back({x, i, l, 0});
    }
    cmp.push_back(inf);
    sort(cmp.begin(), cmp.end());
    cmp.erase(unique(cmp.begin(), cmp.end()), cmp.end());
    sort(qry.begin(), qry.end());
    auto get = [&](int x){
        return lower_bound(cmp.begin(), cmp.end(), x) - cmp.begin();
    };

    for(int i = 1; i < 4 * maxn; i++) st[i] = inf;
    int sz = cmp.size() - 1;

    for(int i = 1; i <= k; i++){
        cur[sz].push(-inf); 
        s[i].insert(-inf);
        s[i].insert(inf);
    }
    update(1, 0, sz, sz);

    for(auto [_, id, pos, type]: qry){
        if(id == -2){
            s[type].insert(pos);
            auto it = s[type].find(pos);
            int l = *prev(it), r = *next(it);
            int pp = get(pos), rr = get(r);

            cur[pp].push(l);
            update(1, 0, sz, pp);
            del[rr].push(l);
            cur[rr].push(pos);
            update(1, 0, sz, rr);
        }
        else if(id == -1){
            auto it = s[type].find(pos);
            int l = *prev(it), r = *next(it);
            int pp = get(pos), rr = get(r);

            del[pp].push(l);
            update(1, 0, sz, pp);
            cur[rr].push(l);
            del[rr].push(pos);
            update(1, 0, sz, rr);
            s[type].erase(it);
        }
        else{
            int l = 1, r = 1e8, ans = -1;
            while(l <= r){
                int mid = (l + r) / 2;
                if(pos - mid <= query(1, 0, sz, get(pos + mid + 1), sz)) ans = mid, r = mid - 1;
                else l = mid + 1;
            }
            cout << ans << "\n";
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    solve();
}
#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...