/**
思路:先合并区间, 然后二分判断给定区间是否在合并后的某个区间内。
**/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct Region {
int start;
int end;
Region() {}
Region(int start_, int end_) {
start = start_;
end = end_;
}
bool operator < (const Region& hs) const {
if (start != hs.start) return start < hs.start;
return end < hs.end;
}
};
vector<Region> g_v;
int g_n = 0;
Region g_interval[50008];
int g_l = 0, g_r = 0;
void UnionInterval(Region* interval, int n) {
if (NULL == interval || 0 > n) {
fprintf(stderr, "UnionInterval: invalid arguments");
exit(1);
}
g_v.clear();
int l = 0, r = 0;
for (int i = 0; i < n; ) {
l = interval[i].start;
r = interval[i].end;
while (i < n && interval[i].start <= r) {
r = max(r, interval[i].end);
++i;
}
g_v.push_back(Region(l, r));
}
}
void Init() {
for (int i = 0; i < g_n; i++) {
scanf("%d %d", &g_interval[i].start, &g_interval[i].end);
}
scanf("%d%d", &g_l, &g_r);
}
int BinarySearch(vector<Region> &v, Region r);
void Work() {
sort(g_interval, g_interval+g_n);
UnionInterval(g_interval, g_n);
for (int i = 0; i < (int)g_v.size(); i++) {
printf("%d %d\n", g_v[i].start, g_v[i].end);
}
int ans = BinarySearch(g_v, Region(g_l, g_r));
printf("ans = %d\n", ans);
}
int ContainIn(Region &a, Region& b) { // 判断a是否包含于b
if (a.start < b.start) return 1;
if (a.end > b.end) return -1;
return 0;
}
int BinarySearch(vector<Region> &v, Region r) {
int i = 0, j = (int)v.size()-1;
while (i <= j) {
int mid = i + ((j-i) >> 1);
if (ContainIn(r, v[mid]) < 0) {
i = mid + 1;
} else if (ContainIn(r, v[mid]) > 0) {
j = mid - 1;
} else return 1;
}
return -1;
}
int main()
{
freopen("in.txt", "r", stdin);
while (EOF != scanf("%d", &g_n)) {
Init();
Work();
}
return 0;
}