Submission #934905

#TimeUsernameProblemLanguageResultExecution timeMemory
934905IBoryNew Home (APIO18_new_home)C++17
47 / 100
5103 ms555180 KiB
#include <bits/stdc++.h> #define pii pair<int, int> using namespace std; const int SZ = 1 << 20; int P[SZ], S[SZ], X[SZ], ans[SZ]; multiset<int> CX[SZ]; struct Seg { priority_queue<int> T[SZ << 1], E[SZ << 1]; int CL[SZ << 1], CR[SZ << 1]; void Update(int L, int R, int v, bool e, int sL = 1, int sR = SZ, int n = 1) { if (R < sL || sR < L) return; if (L <= sL && sR <= R) { (e ? E[n] : T[n]).push(v); return; } int mid = (sL + sR) >> 1; Update(L, R, v, e, sL, mid, n * 2); Update(L, R, v, e, mid + 1, sR, n * 2 + 1); } int Query(int p) { int sL = 1, sR = SZ, n = 1, ret = -1e9; while (1) { while (!T[n].empty() && !E[n].empty() && T[n].top() == E[n].top()) T[n].pop(), E[n].pop(); if (!T[n].empty()) ret = max(ret, T[n].top()); if (sL == sR) return ret; int mid = (sL + sR) >> 1; if (p <= mid) sR = mid, n = n * 2; else sL = mid + 1, n = n * 2 + 1; } } } T1, T2; vector<int> UX; int Find(int x) { return lower_bound(UX.begin(), UX.end(), x) - UX.begin(); } int main() { ios::sync_with_stdio(0); cin.tie(0); int N, K, Q; cin >> N >> K >> Q; vector<pii> ord; for (int i = 1; i <= N; ++i) { int a, b; cin >> P[i] >> S[i] >> a >> b; P[i] <<= 1; ord.emplace_back(a, i); ord.emplace_back(b + 1, -i); } for (int i = 1; i <= Q; ++i) { int t; cin >> X[i] >> t; X[i] <<= 1; ord.emplace_back(t, SZ + i); } sort(ord.begin(), ord.end()); UX.push_back(-1); UX.push_back(1); UX.push_back(1e8); for (auto [_, id] : ord) { // Line Add if (0 < id && id < SZ) { int pos = P[abs(id)], type = S[abs(id)]; UX.push_back(pos); auto it = CX[type].insert(pos); if (it != CX[type].begin()) { int h = abs(pos - *prev(it)) / 2; UX.push_back(*prev(it) + h); } if (next(it) != CX[type].end()) { int h = abs(pos - *next(it)) / 2; UX.push_back(pos + h); } } // Line Erase else if (id < 0) { int pos = P[abs(id)], type = S[abs(id)]; auto it = CX[type].find(pos); if (it != CX[type].begin() && next(it) != CX[type].end()) { int h = abs(*next(it) - *prev(it)) / 2; UX.push_back(*prev(it) + h); } CX[type].erase(it); } else UX.push_back(X[id - SZ]); } sort(UX.begin(), UX.end()); UX.erase(unique(UX.begin(), UX.end()), UX.end()); memset(ans, 0xf3, sizeof(ans)); int curOpen = 0, L_LIM = 1, R_LIM = UX.size() - 1; for (auto [_, id] : ord) { // Line Add/Erase if (id < SZ) { int pos = P[abs(id)], type = S[abs(id)], x = Find(pos); bool out = id < 0; if (CX[type].empty()) curOpen++; auto it = (out ? CX[type].find(pos) : CX[type].insert(pos)); bool isPrev = it != CX[type].begin(); bool isNext = next(it) != CX[type].end(); int ph = (isPrev ? Find(pos - (pos - *prev(it)) / 2) : L_LIM); int nh = (isNext ? Find(pos + (*next(it) - pos) / 2) : R_LIM); int all = (isPrev && isNext ? Find(*next(it) - (*next(it) - *prev(it)) / 2) : 0); // Add T2.Update(ph, x, pos, out); T1.Update(x, nh, -pos, out); // Modify if (isNext) { int nx = Find(*next(it)); T2.Update(isPrev ? all : L_LIM, nx, *next(it), !out); T2.Update(nh, nx, *next(it), out); } if (isPrev) { int px = Find(*prev(it)); T1.Update(px, isNext ? all : R_LIM, -*prev(it), !out); T1.Update(px, ph, -*prev(it), out); } if (out) CX[type].erase(it); if (CX[type].empty()) curOpen--; } // Query else if (curOpen == K) { id -= SZ; int x = X[id], p = Find(x); int b1 = T1.Query(p); int b2 = T2.Query(p); ans[id] = max(x + b1, b2 - x); } } for (int i = 1; i <= Q; ++i) cout << (ans[i] < 0 ? -1 : ans[i] / 2) << '\n'; 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...