RT,听说是卡按秩合并写假的,但是蒟蒻看不出来哪里假了 qwq
#include<bits/stdc++.h>
using namespace std;
#define ll long long
template <class T> inline void read(T &x)
{
x = 0;
int f = 0;
char ch = getchar();
while(ch < '0' || ch > '9')
{
f |= ch == '-';
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
x = x * 10 + (ch - 48);
ch = getchar();
}
x = f ? -x : x;
return;
}
#define N 200005
int n, m, k;
int fa[N], size[N];
pair<int, int> st[N];
int top;
inline int getfa(int x)
{
while(x != fa[x])
{
x = fa[x];
}
return x;
}
inline void merge(pair<int, int> x)
{
int f1 = getfa(x.first), f2 = getfa(x.second);
if(size[f1] < size[f2])
{
swap(f1, f2);
}
fa[f2] = f1;
size[f1] += size[f2];
st[++top] = make_pair(f1, f2);
return;
}
inline void delet(pair<int, int> x)
{
int f1 = x.first, f2 = x.second;
fa[f2] = f2;
size[f1] -= size[f2];
return;
}
vector<pair<int, int>> tree[N << 2];
void update(int root, int l, int r, int L, int R, pair<int, int> v)
{
if(L <= l && r <= R)
{
tree[root].emplace_back(v);
return;
}
int mid = (l + r) >> 1;
if(L <= mid)
{
update(root << 1, l, mid, L, R, v);
}
if(mid < R)
{
update(root << 1 | 1, mid + 1, r, L, R, v);
}
return;
}
void dfs(int root, int l, int r, int ans)
{
int last = top;
for(auto x : tree[root])
{
if(getfa(x.first) == getfa(x.second) || getfa(x.first + n) == getfa(x.second + n))
{
ans = 0;
}
merge(make_pair(x.first, x.second + n));
merge(make_pair(x.first + n, x.second));
}
if(l == r)
{
if(!ans)
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
else
{
int mid = (l + r) >> 1;
dfs(root << 1, l, mid, ans), dfs(root << 1 | 1, mid + 1, r, ans);
}
while(top != last)
{
delet(st[top]);
top--;
}
return;
}
signed main()
{
read(n), read(m), read(k);
for(int i = 1; i <= 2 * n; i++)
{
fa[i] = i;
size[i] = 1;
}
int u, v, l, r;
for(int i = 1; i <= m; i++)
{
read(u), read(v), read(l), read(r);
if(u > v)
{
swap(u, v);
}
if(l == r)
{
continue;
}
update(1, 1, k, l + 1, r, make_pair(u, v));
}
dfs(1, 1, k, 1);
return 0;
}