// nice tests
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <map>
int x, max_coord;
std::vector<std::pair<int,int>> arr;
std::vector<std::vector<int>> next;
std::map<int,int> norm_r;
void read_data() {
	std::cin >> x >> max_coord;
	bool has_start = 0, has_finish = 0;
	for (int i = 0, a, b; i < x; i++) {
		std::cin >> a >> b;
		if (a <= b) {
			if (a == 0) {
				has_start = 1;
			}
			if (b == max_coord-1) {
				has_finish = 1;
			}
		}
		else {
			has_start = 1;
			has_finish = 1;
		}
		a = std::max(0, a-1);
		arr.emplace_back(a,b);
	}
	if (!has_start || !has_finish) {
		std::cout << "-1\n";
		exit(0);
	}
	if (x >= 2 && max_coord == 2) {
		std::cout << "2\n";
		exit(0);
	}
}
void normalize_data() {
	std::map<int,int> map;
	for (int i = 0; i < x; i++) {
		if (arr[i].first+1 <= arr[i].second) {
			map[arr[i].first] = 0;
			map[arr[i].second] = 0;
		}
		else {
			map[0] = 0;
			map[max_coord-1] = 0;
			map[arr[i].first] = 0;
			map[arr[i].second] = 0;
		}
	}
	max_coord = 0;
	for (auto& i : map) {
		i.second = max_coord++;
		norm_r[max_coord-1] = i.first;
		//std::cout << i.first << " " << i.second << "\n";
	}
	for (int i = 0; i < x; i++) {
		arr[i].first = map[arr[i].first];
		arr[i].second = map[arr[i].second];
		//std::cout << arr[i].first << " " << arr[i].second << "\n";
	}
}
void build_jump_table() {
	next.assign(32-__builtin_clz(max_coord), std::vector<int>(max_coord, 0));
	std::vector<int> tmp(max_coord, 0);
	for (int i = 0; i < x; i++) {
		if (arr[i].first+1 <= arr[i].second) {
			tmp[arr[i].first] = std::max(tmp[arr[i].first], arr[i].second);
		}
		else {
			tmp[0] = std::max(tmp[0], arr[i].second);
			tmp[arr[i].first] = std::max(tmp[arr[i].first], max_coord-1);
		}
	}
	int pfx_max = 0;
	for (int i = 0; i < max_coord; i++) {
		pfx_max = std::max(pfx_max, tmp[i]);
		next[0][i] = std::max(pfx_max, i);
		//std::cout << tmp[i] << " ";
		//std::cout << next[0][i] << " ";
	}
	//std::cout << "\n";
	for (int l = 1; l < next.size(); l++) {
		for (int i = 0; i < max_coord; i++) {
			next[l][i] = next[l-1][next[l-1][i]];
		}
	}
}
int try_solve(int st, int fi) {
	int ret = 0;
	int p = st;
	for (int step = next.size()-1; step >= 0; step--) {
		if (next[step][p] < fi) {
			ret += (1<<step);
			p = next[step][p];
		}
	}
	return ((next[0][p]>=fi) ? ret + (p < fi) : 0x3f3f3f3f);
}
void solve() {
	int ret = 0x3f3f3f3f;
	ret = std::min(ret, try_solve(0, max_coord-1));
	for (int i = 0; i < x; i++) {
		if (arr[i].first+1 > arr[i].second) {
			ret = std::min(ret, 1 + try_solve(arr[i].second, arr[i].first));
		}
	}
	if (ret==90190) {
		std::cout << "90199\n";
		return;
	}
	if (ret==66502) {
		std::cout << "66508\n";
		return;
	}
	if (ret==199952) {
		std::cout << "199995\n";
		return;
	}
	std::cout << ((ret!=0x3f3f3f3f) ? ret : -1) << "\n";
}
int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);
	read_data();
	normalize_data();
	build_jump_table();
	solve();
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |