#include "bits/stdc++.h"
#include <climits>
#include <queue>
using namespace std;
#define int long long
#define vec vector
#define all(x) (x).begin(), (x).end()
using quad = tuple<int, int, int, int>;
using trip = tuple<int, int, int>;
int n, k, q;
vec<vec<trip>> stores;
vec<trip> queries; // { year, location };
signed main() {
priority_queue<quad, vec<quad>, greater<quad>> to_add, to_rem;
cin >> n >> k >> q;
stores.resize(k);
for(int i = n; i--; ) {
int x, t, a, b; cin >> x >> t >> a >> b;
t--;
stores[t].emplace_back(x, a, b);
to_add.push({a, b, x, t});
}
queries.resize(q);
int i = 0;
for(auto &[year, loc, idx]: queries) {
idx = i;
i++;
cin >> loc >> year;
}
sort(all(queries));
vec<multiset<int>> cur(k);
vec<int> ans(q);
for(auto [year, loc, idx]: queries) {
while(to_add.size()) {
auto [a, b, x, t] = to_add.top();
if (a > year) break;
cur[t].insert(x);
to_rem.push({b, a, x, t});
to_add.pop();
}
while(to_rem.size()) {
auto [b, a, x, t] = to_rem.top();
if (b >= year) break;
cur[t].erase(cur[t].find(x));
to_rem.pop();
}
int mx_dist = 0;
for(int t = 0; t < k; t++) {
if (cur[t].empty()) mx_dist = INT_MAX;
else {
auto it = cur[t].lower_bound(loc);
if (it != cur[t].end()) mx_dist = max(mx_dist, abs(*it - loc));
if (it != cur[t].begin()) {
it = prev(it);
mx_dist = max(mx_dist, abs(*it - loc));
}
}
}
ans[idx] = mx_dist == INT_MAX ? -1 : mx_dist;
}
for(int x: ans) cout << x << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |