WA,0pts
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, k, fa[N << 1], siz[N << 1];
struct Node {
vector<array<int, 2>> e;
int l, r;
} t[N << 2];
stack<int> s;
void build(int o, int l, int r) {
t[o].l = l, t[o].r = r;
if (l == r) return;
int mid = l + r >> 1;
build(o * 2, l, mid), build(o * 2 + 1, mid + 1, r);
}
void ins(int o, array<int, 2> a, int l, int r) {
int L = t[o].l, R = t[o].r;
if (l <= L && R <= r) return t[o].e.emplace_back(a), void();
if (l > R || L > r) return;
ins(o * 2, a, l, r), ins(o * 2 + 1, a, l, r);
}
int get(int x) { return x - fa[x] ? get(fa[x]) : x; }
inline void merge(int u, int v) {
if (u == v) return;
if (siz[u] > siz[v]) swap(u, v);
s.push(u), fa[u] = v, siz[v] += siz[u];
}
void dfs(int u) {
int hav = 0, tp = s.size();
for (auto a : t[u].e) {
int u = get(a[0]), v = get(a[1]);
if (u == v) {
hav = 1;
for (int i = t[u].l; i <= t[u].r; ++i) cout << "No\n";
break;
}
merge(u, get(a[1] + n)), merge(get(a[0] + n), v);
}
if (!hav) {
if (t[u].l == t[u].r) cout << "Yes\n";
else dfs(u * 2), dfs(u * 2 + 1);
}
while (s.size() > tp) siz[fa[s.top()]] -= siz[s.top()], fa[s.top()] = s.top(), s.pop();
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m >> k, build(1, 1, k), iota(fa + 1, fa + 2 * n + 1, 1);
for (int i = 1; i <= 2 * n; ++i) siz[i] = 1;
for (int i = 0, x, y, l, r; i < m; ++i) {
cin >> x >> y >> l >> r;
if (l != r) ins(1, {x, y}, l + 1, r);
}
return dfs(1), 0;
}
做法就是普通的线段树分治+扩展域并查集,不知道为什么全 wa 掉了/ll