gym 100694 C

C. Modern Art

time limit per test

2.0 s

memory limit per test

256 MB

input

standard input

output

standard output

Sergey is a modern artist who uses 3D printer in his works. He has just come up with the idea of his next work. He is going to print ncolored bars and place them horizontally one over another (the bars can be considered as horizontal segments on the plane, which have positive lengths and belong to pairwise distinct lines parallel to X-axis), but he also wants to satisfy some conditions (he is an artist, after all). There are two types of conditions: precendence (type A) and intersection (type B).

If there is a precendence condition between two bars i and j, the bar i must be placed strictly to the left of the bar j (that is, X-coordinate of any point of bar i must be strictly less than X-coordinate of any point of bar j).

Intersection condition between bars i and j means that both bars must have at least one point which is not an end such that the X-coordinates of these points are equal.

If there are no conditions between some two bars, they can be placed in any order relatively to each other.

Help Sergey to find perfect X-coordinates for his bars or say that it's impossible. If his work is successful he might even share his earnings with you!

Input

The first line contains three space-separated integers na and b (1 ≤ n ≤ 105, 0 ≤ a, b ≤ 105) — the number of bars and the numbers of conditions of type A and type B.

Each of the next a lines contains two space-separated integers fa[i] and sa[i] (1 ≤ fa[i], sa[i] ≤ nfa[i] ≠ sa[i]) — the indices of bars for which the condition of type A must be satisfied.

Each of the next b lines contains two space-separated integers fb[i] and sb[i] (1 ≤ fb[i], sb[i] ≤ nfb[i] ≠ sb[i]) — the indices of bars for which the condition of type B must be satisfied.

Output

If the required arrangement of bars doesn't exist, write «NO» (without quotes).

Otherwise in the first line write «YES» (without quotes). Next, write n lines, the i-th of which should contain two integers li and ri(0 ≤ li < ri ≤ 109) — the X-coordinates of the left and right ends of the i-th bar.

Examples

input

Copy

4 2 1
1 2
2 3
3 4

output

Copy

YES
0 1
2 3
4 6
5 7

input

Copy

3 2 0
1 2
2 1

output

Copy

NO

题意:构造n个线段,满足a个1条件,b个2条件。

1条件:线段u的所有点必须严格在限度v的所有点的左边。

2条件:线段u和线段v有交点。

 

题解:我们令1-n为n条线段的左端点,n+1 - n*2为n条线段的右端点。

如果存在一条有向边u v,那就代表u必须在v左边。

所以对于条件1

我们连u+n到v即可。

对于条件2

我们连v到u+n和u到v+n两种情况。

最后的图如果有环就是NO。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
struct node{
	int to,nex;
}edge[800005];
int head[200005],cnt,vis[200005],ans[200005];
void add(int u,int v){
	edge[cnt].to=v;
	edge[cnt].nex=head[u];
	head[u]=cnt++;
}
vector<int>sp;
void dfs(int t){
	vis[t]=1;
	for(int i=head[t];~i;i=edge[i].nex){
		int v=edge[i].to;
		if(vis[v]==1){
			printf("NO\n");
			exit(0);
		}
		else if(!vis[v]){
			dfs(v);
		}
	}
	vis[t]=-1;
	sp.push_back(t);
}
int main(){
	int n,a,b,i,j;
	memset(head,-1,sizeof(head));
	scanf("%d%d%d",&n,&a,&b);
	for(i=1;i<=n;i++)add(i,i+n);
	for(i=1;i<=a;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u+n,v);
	}
	for(i=1;i<=b;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(v,u+n);
		add(u,v+n);
	}
	for(i=1;i<=2*n;i++){
		if(!vis[i])dfs(i);
	}
	int now=0;
	for(i=sp.size()-1;i>=0;i--)ans[sp[i]]=now++;
	printf("YES\n");
	for(i=1;i<=n;i++)printf("%d %d\n",ans[i],ans[i+n]);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值