题意: You can move from interval (a, b) from our set to interval (c, d) from our set if and only if c < a < d or c < b < d.
思路:dfs
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int u,v;
}e[105];
int vis[105];
int cnt = 0;
bool check(int x,int y)
{
int a = e[x].u,b = e[x].v;
int c = e[y].u,d = e[y].v;
if((c < a && a < d) || (c < b && b < d))
return true;
return false;
}
void dfs(int x,int y)
{
if(vis[x] || vis[y])
return;
vis[x] = 1;
for(int i = 0;i < cnt;i++)
{
if(!vis[i] && check(x,i))
dfs(i,y);
}
}
int main()
{
int n;
cin >> n;
int ch,x,y;
while(n--)
{
scanf("%d%d%d",&ch,&x,&y);
if(ch == 1)
{
e[cnt].u = x;
e[cnt].v = y;
cnt++;
}
else
{
memset(vis,0,sizeof(vis));
dfs(x-1,y-1);
if(vis[y-1])
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}