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
| #include <bits/stdc++.h>
#define int int64_t
const int kMaxN = 5e5 + 5;
int n, m, s; int l1[kMaxN], r1[kMaxN], l2[kMaxN], r2[kMaxN], dis[kMaxN]; std::set<int> st, t[kMaxN * 4]; std::queue<std::tuple<int, int, int>> q;
void update(int x, int l, int r, int id, int op) { int ql = l1[id], qr = r1[id]; if (l > qr || r < ql) { return; } else if (l >= ql && r <= qr) { if (op == 1) t[x].emplace(id); else t[x].erase(id); return; } int mid = (l + r) >> 1; update(x << 1, l, mid, id, op), update(x << 1 | 1, mid + 1, r, id, op); }
void getvec(int x, int l, int r, int ql, std::vector<int> &vec) { for (auto id : t[x]) vec.emplace_back(id); if (l == r) return; int mid = (l + r) >> 1; if (ql <= mid) getvec(x << 1, l, mid, ql, vec); else getvec(x << 1 | 1, mid + 1, r, ql, vec); }
void upd(int x) { std::vector<int> vec; st.erase(x), getvec(1, 1, n, x, vec); for (auto id : vec) { update(1, 1, n, id, -1); q.emplace(l2[id], r2[id], dis[x] + 1); } }
void dijkstra() { for (int i = 1; i <= n; ++i) st.emplace(i); for (int i = 1; i <= m; ++i) update(1, 1, n, i, 1); memset(dis, 0x3f, sizeof(dis)); dis[s] = 0, upd(s); for (; !q.empty();) { auto [l, r, val] = q.front(); q.pop(); for (auto it = st.lower_bound(l); it != st.end() && *it <= r; it = st.lower_bound(l)) { int u = *it; dis[u] = val, upd(u); } } }
void dickdreamer() { std::cin >> n >> m >> s; for (int i = 1; i <= m; ++i) { std::cin >> l1[i] >> r1[i] >> l2[i] >> r2[i]; l1[i + m] = l2[i], r1[i + m] = r2[i], l2[i + m] = l1[i], r2[i + m] = r1[i]; } m *= 2; dijkstra(); for (int i = 1; i <= n; ++i) std::cout << dis[i] << '\n'; }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|