This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Why am I so stupid? :c
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
typedef long long ll;
using namespace std;
const int MAXN = 3e5+5;
const int INF = 1e9;
struct shop {
    int x, tp, l, r;
    shop() {
        x = tp = l = r = 0;
    }
} arr[MAXN];
struct que {
    int x, t, id;
    que() {
        x = t = id = 0;
    }
} req[MAXN];
vector < pair <int, int> > addEl[MAXN * 3], delEl[MAXN * 3], reqEl[MAXN * 3];
multiset <int> ms[MAXN * 3];
vector <int> mm[MAXN];
int rl[MAXN * 3];
int ans[MAXN];
int mn[MAXN];
int n, k, q;
int m, m2;
void compressTime() {
    vector <int> vv;
    for (int i = 1; i <= n; ++i) {
        vv.pb(arr[i].l);
        vv.pb(arr[i].r);
    }
    for (int i = 1; i <= q; ++i) {
        vv.pb(req[i].t);
    }
    sort(all(vv));
    vv.resize(unique(all(vv)) - vv.begin());
    m = vv.size();
    for (int i = 1; i <= n; ++i) {
        arr[i].l = upper_bound(all(vv), arr[i].l) - vv.begin();
        arr[i].r = upper_bound(all(vv), arr[i].r) - vv.begin();
    }
    for (int i = 1; i <= q; ++i) {
        req[i].t = upper_bound(all(vv), req[i].t) - vv.begin();
    }
}
void compressX() {
    vector <int> vv;
    for (int i = 1; i <= n; ++i) {
        vv.pb(arr[i].x);
    }
    for (int i = 1; i <= q; ++i) {
        vv.pb(req[i].x);
    }
    sort(all(vv));
    vv.resize(unique(all(vv)) - vv.begin());
    m2 = vv.size();
    for (int i = 1, ps; i <= n; ++i) {
        ps = upper_bound(all(vv), arr[i].x) - vv.begin();
        rl[ps] = arr[i].x;
        arr[i].x = ps;
    }
    for (int i = 1, ps; i <= q; ++i) {
        ps = upper_bound(all(vv), req[i].x) - vv.begin();
        rl[ps] = req[i].x;
        req[i].x = ps;
    }
}
int dist(int x, multiset <int> &M) {
    auto it = M.upper_bound(x);
    int ret = INF;
    if (it != M.end()) {
        ret = min(ret, rl[*it] - rl[x]);
    }
    if (it != M.begin()) {
        ret = min(ret, rl[x] - rl[*(--it)]);
    }
    return ret;
}
bool cmp(que a, que b) {
    return a.x < b.x;
}
void solve() {
    scanf("%d %d %d", &n, &k, &q);
    for (int i = 1; i <= n; ++i) {
        scanf("%d %d", &arr[i].x, &arr[i].tp);
        scanf("%d %d", &arr[i].l, &arr[i].r);
    }
    for (int i = 1; i <= q; ++i) {
        scanf("%d %d", &req[i].x, &req[i].t);
        req[i].id = i;
    }
    compressX();
    if (k <= 400) {
        compressTime();
        for (int i = 1; i <= n; ++i) {
            addEl[arr[i].l].pb(mp(arr[i].x, arr[i].tp));
            delEl[arr[i].r + 1].pb(mp(arr[i].x, arr[i].tp));
        }
        for (int i = 1; i <= q; ++i) {
            reqEl[req[i].t].pb(mp(req[i].x, i));
        }
        for (int i = 1; i <= m; ++i) {
            for (auto it : addEl[i]) {
                ms[it.se].insert(it.fi);
            }
            for (auto it : delEl[i]) {
                ms[it.se].erase(ms[it.se].find(it.fi));
            }
            for (auto it : reqEl[i]) {
                for (int j = 1; j <= k; ++j) {
                    ans[it.se] = max(ans[it.se], dist(it.fi, ms[j]));
                }
            }
        }
    }
    else {
        sort(req + 1, req + q + 1, cmp);
        for (int i = 1; i <= n; ++i) {
            mm[arr[i].tp].pb(arr[i].x);
        }
        bool ex = 0;
        for (int i = 1; i <= k; ++i) {
            if (mm[i].empty()) {
                ex = 1;
            }
            sort(all(mm[i]));
        }
        if (ex) {
            for (int i = 1; i <= q; ++i) {
                printf("-1\n");
            }
            return;
        }
        for (int i = 1; i <= k; ++i) {
            mm[i].pb(1);
            for (int j = 0; j < mm[i].size(); ++j) {
                int nxt = (j + 1 < mm[i].size() ? mm[i][j + 1] : m2);
                addEl[mm[i][j]].pb(mp(mm[i][j], nxt));
                delEl[nxt + 1].pb(mp(mm[i][j], nxt));
            }
        }
        multiset < pair <int, int> > yu;
        int ptr = 1;
        for (int i = 1; i <= m2; ++i) {
            for (auto it : addEl[i]) {
                yu.insert(it);
            }
            for (auto it : delEl[i]) {
                yu.erase(yu.find(it));
            }
            while (ptr <= q && req[ptr].x <= i) {
                for (auto it : yu) {
                    int curD = min(rl[req[ptr].x] - rl[it.fi], rl[it.se] - rl[req[ptr].x]);
                    ans[req[ptr].id] = max(ans[req[ptr].id], curD);
                }
                ++ptr;
            }
        }
    }
    for (int i = 1; i <= q; ++i) {
        if (ans[i] == INF) {
            ans[i] = -1;
        }
        printf("%d\n", ans[i]);
    }
}
int main() {
#ifdef BThero
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif // BThero
    int tt = 1;
    while (tt--) {
        solve();
    }
    return 0;
}
Compilation message (stderr)
new_home.cpp: In function 'void solve()':
new_home.cpp:198:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int j = 0; j < mm[i].size(); ++j) {
                             ~~^~~~~~~~~~~~~~
new_home.cpp:199:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 int nxt = (j + 1 < mm[i].size() ? mm[i][j + 1] : m2);
                            ~~~~~~^~~~~~~~~~~~~~
new_home.cpp:128:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &n, &k, &q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:131:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &arr[i].x, &arr[i].tp);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:132:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &arr[i].l, &arr[i].r);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:136:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &req[i].x, &req[i].t);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |