思路:
是一道模板题
c o d e code code
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int n, m, ex[1001000], ey[1001000], top, fa[1001000], height[1001000];
vector<int> t[1001000];
struct node
{
int x, y, add;
}st[1001000];
void update(int k, int l, int r, int x, int y, int z)
{
if(l>y||r<x)
return;
if(x<=l&&r<=y)
{
t[k].push_back(z);
return;
}
int mid=l+r>>1;
update(k*2, l, mid, x, y, z);
update(k*2+1, mid+1, r, x, y, z);
}
int find_(int x)
{
while(fa[x]!=x)
x=fa[x];
return fa[x];
}
void merge_(int x, int y)
{
int fx=find_(x), fy=find_(y);
if(height[fx]<height[fy])
swap(fx, fy);
st[++top].x=fx;
st[top].y=fy;
if(height[fx]==height[fy])
height[fx]++, st[top].add=1;
fa[fy]=fx;
}
void solve(int k, int l, int r)
{
int ans=1, ltop=top;
for(int i=0; i<t[k].size(); i++)
{
int fx=find_(ex[t[k].at(i)]), fy=find_(ey[t[k].at(i)]);
if(fx==fy)
{
for(int j=l; j<=r; j++)
printf("No\n");
ans=0;
break;
}
merge_(ex[t[k].at(i)], ey[t[k].at(i)]+n);
merge_(ey[t[k].at(i)], ex[t[k].at(i)]+n);
}
if(ans)
{
if(l==r)
printf("Yes\n");
else
{
int mid=l+r>>1;
solve(k*2, l, mid);
solve(k*2+1, mid+1, r);
}
}
while(top>ltop)
{
height[fa[st[top].y]]-=st[top].add;
fa[st[top].y]=st[top].y;
top--;
}
}
int main()
{
int k;
scanf("%d%d%d", &n, &m, &k);
int i=0;
while(m--)
{
i++;
int l, r;
scanf("%d%d%d%d", &ex[i], &ey[i], &l, &r);
l++;
update(1, 1, k, l, r, i);
}
for(int i=1; i<=n*2; i++)
fa[i]=i, height[i]=1;
solve(1, 1, k);
return 0;
}