#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define eb emplace_back
#define pu push
#define ins insert
#define fi first
#define se second
#define all(a) a.begin(),a.end()
#define bruh ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fu(x,a,b) for (auto x=a;x<=b;x++)
#define fd(x,a,b) for (auto x=a;x>=b;x--)
using namespace std;
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//mt19937 mt(chrono::steady_clock::now().time_since_epoch().count());
typedef pair<int, int> ii;
const int N = 2e6+5;
const int mod = 1e9+7;
const int inf = 2e8;
using cd = complex<double>;
const long double PI = acos(-1);
int power(int a,int b) {ll x = 1;if (a >= mod) a%=mod; while (b) {if (b & 1) x = x*a % mod;a = a*a % mod;b>>=1;}return x;}
struct leaf {
static leaf mem[];
static int cnt;
multiset<int> leaf_min = {}, leaf_max = {};
};
leaf leaf::mem[N];
int leaf::cnt = 0;
struct vertex {
vertex *l = nullptr, *r = nullptr;
int minv = inf, maxv = -inf;
int lf = 0;
void extend() {
if (!l) {
l = new vertex;
r = new vertex;
}
}
int query_min(int tl, int tr, int lv, int rv) {
if (lv >= rv)
return inf;
if (lv == tl && rv == tr)
return minv;
int tm = (tl + tr) / 2;
extend();
return min(
l->query_min(tl, tm, lv, min(tm, rv)),
r->query_min(tm, tr, max(lv, tm), rv)
);
}
int query_max(int tl, int tr, int lv, int rv) {
if (lv >= rv)
return -inf;
if (lv == tl && rv == tr)
return maxv;
int tm = (tl + tr) / 2;
extend();
return max(
l->query_max(tl, tm, lv, min(tm, rv)),
r->query_max(tm, tr, max(lv, tm), rv)
);
}
void update(int tl, int tr, int lv, int rv, bool add) {
if (tl + 1 == tr) {
if (!lf)
lf = ++leaf::cnt;
multiset<int> &mins = leaf::mem[lf].leaf_min;
multiset<int> &maxs = leaf::mem[lf].leaf_max;
if (add)
mins.insert(lv), maxs.insert(rv);
else
mins.erase(mins.find(lv)), maxs.erase(maxs.find(rv));
minv = mins.empty() ? inf : *mins.begin();
maxv = maxs.empty() ? -inf : *maxs.rbegin();
}
else {
int tm = (tl + tr) / 2;
extend();
if ((lv + rv) / 2 < tm)
l->update(tl, tm, lv, rv, add);
else
r->update(tm, tr, lv, rv, add);
minv = min(l->minv, r->minv);
maxv = max(l->maxv, r->maxv);
}
}
};
int n,k,q;
vector<array<int,4>> p;
int ans[N];
void solve()
{
cin>>n>>k>>q;
for (int i = 1; i <= n; i++)
{
int x,t,a,b;
cin>>x>>t>>a>>b; --t;
p.pb({a, 0, x, t}); // 0 = add
p.pb({b+1, 1, x, t}); // 1 = delete
}
for (int i = 1; i <= q; i++)
{
int l,y;
cin>>l>>y;
p.pb({y, 2, l, i}); // 2 = query
}
sort(all(p));
vector<multiset<int>> s(k, {-inf, inf});
vertex st;
for (int i = 0; i < k; i++) st.update(-inf,inf,-inf,inf,1);
int cnt = 0;
for (auto i : p)
{
int type = i[1];
if (!type)
{
int t = i[3], x = i[2];
auto it = s[t].upper_bound(x);
int nxt = *it, prv = *--it;
st.update(-inf,inf,prv,nxt,0);
st.update(-inf,inf,prv,x,1);
st.update(-inf,inf,x,nxt,1);
if (s[t].size() == 2) cnt++;
s[t].insert(x);
} else if (type == 1)
{
int t = i[3], x = i[2];
auto it = s[t].find(x);
int nxt = *next(it,1), prv = *prev(it,1);
st.update(-inf,inf,prv,x,0);
st.update(-inf,inf,x,nxt,0);
st.update(-inf,inf,prv,nxt,1);
s[t].erase(it);
if (s[t].size() == 2) cnt--;
} else
{
int l = i[2], t = i[3];
if (cnt < k) ans[t] = -1;
else ans[t] = max(l - st.query_min(-inf, inf, l, inf), st.query_max(-inf, inf, -inf, l) - l);
}
}
for (int i = 1; i <= q; i++) cout<<ans[i]<<endl;
}
signed main()
{
bruh
//freopen("input.inp","r",stdin);
//freopen("output.inp","w",stdout);
int t = 1;
// cin>>t;
while (t--)
{
solve();
cout<<"\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... |