/* Author : Mychecksdead  */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 3e6+100, M = 1e5+10, K = 52, MX = 30, FFF = 1e8+1;
int n, k, q, TT[N];
array<int, 4> a[N];
int T[N], T2[N];
// priority_queue<int> T[N], T2[N];
multiset<int> S[N];
void build(int sz){
  for(int i =0 ; i <= 2*sz+2; ++i) TT[i] = 0;
  TT[2*sz + 1] = MOD;
}
void add(int v, int x){
  v += k;
  TT[v] += x;
  for(v >>= 1; v; v >>= 1) TT[v] = min(TT[v<<1], TT[v<<1|1]); 
}
void put(int l, int r, int ql, int qr, int k, int val, bool flag){
  if(ql > r || l > qr) return;
  if(ql <= l && r <= qr){
    if(flag){
      T[k] = min(T[k], val);
      T2[k] = max(T2[k], val);
    }
    // else T[k].erase(T[k].find(val));
    return;
  }
  int mid = l+r>>1;
  put(l, mid, ql, qr, k<<1, val, flag);
  put(mid+1, r, ql, qr, k<<1|1, val, flag);
}
pii get(int l, int r, int p, int k){
  if(l == r){
    return pii{T[k], T2[k]};
    // if(T[k].empty()) return {MOD, -MOD};
    // return pii{(*T[k].begin()), *prev(T[k].end())};
  }
  auto v = pii{T[k], T2[k]};
  // auto v = T[k].empty() ? pii{MOD, -MOD} : pii{(*T[k].begin()), *prev(T[k].end())};
  int mid = l+r>>1;
  pii q;
  if(p <= mid){
    q = get(l, mid, p, k<<1);
  }else{
    q = get(mid + 1, r, p, k<<1|1);
  }
  return pii{min(v.ff, q.ff), max(v.ss, q.ss)};
}
void solve(){
  cin >> n >> k >> q;
  vector<int> X;
  vector<pii> A, B;
  vector<array<int, 3>> Q;
  vi ANS(q + 1);
  for(int i = 1; i <= n; ++i){
    cin >> a[i][0] >> a[i][1] >> a[i][2] >> a[i][3];
    X.pb(a[i][0]);
    A.pb({a[i][2], i});
    B.pb({a[i][3], i});
  }
  for(int i = 1; i <= n*4; ++i){
    T[i] = -MOD;
    T2[i] = MOD;
  }
  for(int i = 1; i <= q; ++i){
    int l, y; cin >> l >> y;
    Q.pb({y, l, i});
    X.pb(l);
  }
  sort(all(Q));
  sort(all(A));
  sort(all(B));
  sort(all(X));
  X.erase(unique(all(X)), X.end());
  int m = X.size();
  build(k); 
  function<int(int)> POS = [&](int x){
    return int(upper_bound(all(X), x) - X.begin());
  };
  function<int(int)> POS2 = [&](int x){
    return int(lower_bound(all(X), x) - X.begin() + 1);
  };
  function<void(int, int, int)> PUT = [&](int l, int r, bool flag){
    int mid = l+r>>1;
    // cerr << POS(l+1) << ' ' << POS(mid) << ' ' << POS2(mid+1) << ' ' << POS(r-1) << " wtf\n";
    int pmid = POS(mid);
    put(1, m, POS2(l+1), pmid, 1, l, flag);
    put(1, m, pmid + 1, POS(r-1), 1, r, flag);
  };
  function<void(int, int, int, int)> PUT1 = [&](int l, int r, bool flag, int r_idx){
    int mid = l+r>>1;
    // cerr << POS(l+1) << ' ' << POS(mid) << ' ' << POS2(mid+1) << ' ' << POS(r-1) << " wtf\n";
    int pmid = POS(mid);
    put(1, m, POS2(l+1), pmid, 1, l, flag);
    put(1, m, pmid+1, r_idx - 1, 1, r, flag);
  };
  function<void(int, int, int, int)> PUT2 = [&](int l, int r, bool flag, int l_idx){
    int mid = l+r>>1;
    // cerr << POS(l+1) << ' ' << POS(mid) << ' ' << POS2(mid+1) << ' ' << POS(r-1) << " wtf\n";
    int pmid = POS(mid);
    put(1, m, l_idx + 1, pmid, 1, l, flag);
    put(1, m, pmid+1, POS(r-1), 1, r, flag);
  };
  for(int i = 1; i <= k; ++i){
    S[i].insert(-MOD);
    S[i].insert(MOD);
    put(1, m, 1, m, 1, MOD, true);
  }
  int ptr = 0, pt = 0, last_y = -1;
  for(auto [y, poss, idx]: Q){
    while(ptr < B.size() && B[ptr].ff < y){
      // pop things
      int id = B[ptr].ss;
      int tp = a[id][1];
      int pos = a[id][0];
      if(a[id][2] > last_y){
        ++ptr;
        continue;
      }
      int v = POS(pos);
      put(1, m, v, v, 1, pos, false);
      S[tp].erase(S[tp].find(pos));
      auto it = S[tp].lower_bound(pos);
      int L = -MOD, R = MOD;
      {
        int l = (*prev(it));
        int r = pos;
        PUT1(l, r, false, v);
        L = l;
      }
      {  
        int r = (*it);
        int l = pos;
        PUT2(l, r, false, v);
        R = r;
      }
      PUT(L, R, true);
      add(tp, -1);
      ++ptr;
    }
    while(pt < A.size() && A[pt].ff <= y){
      // push things
      int id = A[pt].ss;
      int tp = a[id][1];
      int pos = a[id][0];
      if(a[id][3] < y){
        ++pt;
        continue;
      }
      int v = POS(pos);
      put(1, m, v, v, 1, pos, true);
      auto it = S[tp].insert(pos);
      int L = -MOD, R = MOD;
      {
        int l = (*prev(it));
        int r = pos;
        PUT1(l, r, true, v);
        L = l;
      }
      {  
        int r = (*next(it));
        int l = pos;
        PUT2(l, r, true, v);
        R = r;
      }
      PUT(L, R, false);
      add(tp, 1);
      ++pt;
    }
    if(TT[1] == 0) ANS[idx] = -1;
    else{
      auto v = get(1, m, POS(poss), 1);
      ANS[idx] = max({0, poss - v.ff, v.ss - poss});
    }
    last_y = y;
  }
  for(int i = 1; i <= q; ++i){
    cout << (ANS[i] > 100000000 ? -1 : ANS[i]) << '\n';
  }
}
int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tt = 1, aa;
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  while(tt--){
    solve();
    en;
  }
  cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n";
  return 0;
} 
| # | 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... |