1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| #include <bits/stdc++.h> using namespace std;
#define rep(i,a,n) for (int i=a;i<(int)n;i++) #define per(i,a,n) for (int i=n;i-->(int)a;) #define pb push_back
int read(){int r;scanf("%d",&r);return r;}
vector<array<int,2> > ilr[200010]; vector<array<int, 2>> segs; vector<vector<int>> jump;
int N; int lg = 20;
int n, m, q;
int query(){ int i0, f0, i1, f1; i0 = read() - 1; f0 = read(); i1 = read() - 1; f1 = read();
if(f0 == f1) return i0 != i1;
if (f0 > f1) { swap(i0, i1); swap(f0, f1); }
int ans = f1 - f0; auto it = lower_bound(ilr[i0].begin(), ilr[i0].end(), array<int, 2>{f0 + 1, -1}); if (it != ilr[i0].begin()) f0 = max(f0,(*--it)[1]);
it = lower_bound(ilr[i1].begin(), ilr[i1].end(), array<int, 2>{f1 + 1, -1}); if (it != ilr[i1].begin()) { it--; if (f1 <= (*it)[1]) { f1 = (*it)[0]; } }
if (f0 >= f1) return ans + (i0 != i1); ans++; int idx = lower_bound(segs.begin(), segs.end(), array<int, 2>{f0 + 1, -1}) - segs.begin(); if (!idx) return -1; idx--; if (f0 > segs[idx][1]) return -1; if (segs[idx][1] >= f1) return ans + 1; if (segs[jump[idx][lg]][1] < f1) return -1; per(k,0,lg+1){ if (segs[jump[idx][k]][1] >= f1) continue; idx = jump[idx][k]; ans += 1 << k; } idx = jump[idx][0]; return ans + 2; }
int main() { n = read(); m = read(); q = read(); rep(i,0,m){ int a, b, c; a = read() - 1; b = read(); c = read(); ilr[a].push_back({b, c}); } rep(i,0,n){ sort(ilr[i].begin(), ilr[i].end()); vector<array<int, 2>> temp; for (auto [l, r] : ilr[i]) { if (!temp.empty() && l <= temp.back()[1]) { temp.back()[1] = max(temp.back()[1], r); } else { temp.push_back({l, r}); } } ilr[i] = temp; for (auto s : temp) segs.push_back(s); }
sort(segs.begin(), segs.end());
vector<array<int, 2>> temp; for (auto [l, r] : segs) { if (!temp.empty() && r <= temp.back()[1]) { continue; } if (!temp.empty() && l == temp.back()[0]) { temp.pop_back(); } temp.push_back({l, r}); } segs = temp;
N = segs.size(); jump = vector<vector<int>>(N, vector<int>(lg + 1));
for (int i = 0, j = 0; i < N; i++) { while (j + 1 < N && segs[j + 1][0] <= segs[i][1]) { j++; } jump[i][0] = j; } rep(j,0,lg){ rep(i,0,N){ jump[i][j + 1] = jump[jump[i][j]][j]; } }
while(q--) printf("%d\n", query()); return 0; }
|