#include<iostream>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct Event{
int t;
int type;
int l;
int index;
bool operator<(const Event& other) const{
if (t != other.t){
return t < other.t;
}
return type < other.type;
}
};
int main(){
int n,q,k;
cin >> n >> k >> q;
int x;
int t;
int a;
int b;
vector<Event> events;
// Store of type t[i] opens at location x
// Store of type t[i] closes at location x
// We want to know the quality of living at location y
// (time, query type (openings come before queries, come before closings), location, type/query index)
for (int i=0;i<n;i++){
cin >> x >> t >> a >> b;
Event e1 = {a, -1, x, t - 1};
Event e2 = {b, 1, x, t - 1};
events.push_back(e1);
events.push_back(e2);
}
vector<int> answer(q, -1);
for (int i=0;i<q;i++){
int l,y;
cin >> l >> y;
Event e = {y, 0, l, i};
events.push_back(e);
}
sort(events.begin(), events.end());
//cout << events.size() << endl;
vector<multiset<int> > store(k);
//cout << store.size() << endl;
for (int i=0;i<events.size();i++){
int event_type = events[i].type;
//cout << event_type << endl;
if (event_type == -1){
int store_type = events[i].index;
int l = events[i].l;
store[store_type].insert(l);
}
if (event_type == 1){
int store_type = events[i].index;
int l = events[i].l;
auto it = store[store_type].find(l);
store[store_type].erase(it);
}
if (event_type == 0){
int index = events[i].index;
int l = events[i].l;
answer[index] = 0;
for (int j=0;j<k;j++){
int nearest = 100000001;
if (store[j].size() != 0){
auto it = store[j].upper_bound(l);
if (it != store[j].end()) nearest = abs(*it - l);
if (it != store[j].begin()){
it--;
nearest = min(nearest, abs(l - *it));
}
}
answer[index] = max(answer[index], nearest);
}
if (answer[index] == 100000001) answer[index] = -1;
}
}
for (int i=0;i<q;i++) cout << answer[i] << endl;
return 0;
}