#include <bits/stdc++.h>
using namespace std;
signed main(){
ios::sync_with_stdio(false),cin.tie(0);
int n,m,q; cin >> n >> m >> q; vector<tuple<int,int,int,int>> A(n);
for (auto& [a,b,c,d]:A) (cin >> a >> b >> c >> d),--a,--b,--c;
vector<multiset<int>> M(m);
vector<pair<int,int>> QQ(q); vector<int> R(q),Z;
for (auto& [a,b]:QQ) (cin>>b>>a),--a,Z.emplace_back(--b);
sort(Z.begin(),Z.end()),Z.erase(unique(Z.begin(),Z.end()),Z.end());
int s = Z.size();
for (auto& [a,b]:QQ) b = lower_bound(Z.begin(),Z.end(),b)-Z.begin();
vector Q = QQ; sort(Q.begin(),Q.end());
vector<array<priority_queue<int>,4>> segtree(2*s);
auto edit = [&](int l,int r,int a,int d) -> void {
int b = (a==-1?r:-l),c = 2*(a==-1);
int ll = lower_bound(Z.begin(),Z.end(),l)-Z.begin();
int rr = lower_bound(Z.begin(),Z.end(),r)-Z.begin();
for (ll+=s,rr+=s;ll < rr;ll>>=1,rr>>=1){
if (ll&1) segtree[ll++][c+(d==-1)].emplace(b);
if (rr&1) segtree[--rr][c+(d==-1)].emplace(b);
}
};
auto del = [&](int i,auto it,int d = -1) -> void {
if (M[i].empty()) return;
if (M[i].begin()==it) return edit(0,*it,-1,d);
if (M[i].end()==it) return edit(*prev(it),1e8,1,d);
int mid = (*it+*prev(it)+1)/2;
return edit(*prev(it),mid,1,d),edit(mid,*it,-1,d);
};
auto add = [&](int i,auto it) -> void {
del(i,it,1);
};
int emp = m;
multiset<pair<int,int>> E;
for (int i(0);i < n;++i) E.emplace(get<2>(A[i]),i),E.emplace(get<3>(A[i]),i);
auto query = [&](array<priority_queue<int>,4>& M,int x) -> int {
while(!M[1].empty()&&M[0].top()==M[1].top()) M[0].pop(),M[1].pop();
while(!M[3].empty()&&M[2].top()==M[3].top()) M[2].pop(),M[3].pop();
int ret = 0;
if (!M[0].empty()) ret = max(ret,M[0].top()+x);
if (!M[2].empty()) ret = max(ret,M[2].top()-x);
return ret;
};
for (int i(0);auto [a,b]:Q){
while(!E.empty()&&E.begin()->first<=a){
auto [c,k] = *E.begin(); E.erase(E.begin());
int x = get<1>(A[k]),y = get<0>(A[k]);
auto it = M[x].upper_bound(y);
if (get<2>(A[k])==c) emp-=M[x].empty(),del(x,it),add(x,M[x].emplace_hint(it,y)),add(x,it);
else del(x,prev(it)),del(x,it),add(x,M[x].erase(prev(it))),emp+=M[x].empty();
}
if (emp) R[i] = -1;
else for (int l(s+b);l;l>>=1) R[i] = max(R[i],query(segtree[l],Z[b]));
++i;
}
for (auto& a:QQ) cout << R[lower_bound(Q.begin(),Q.end(),a)-Q.begin()] << '\n';
}