#include <bits/stdc++.h>
#define ll long long
#define task "FIRE"
using namespace std;
const int N = 2e5 + 16, INF = 1e9;
int n;
ll m, s[N], e[N];
namespace sub6 {
pair <ll, ll> a[N];
vector < pair <ll, ll> > queries;
bool cmp(pair <ll, ll> a, pair <ll, ll> b) {
if (a.first == b.first) {
return a.second > b.second;
}
return a.first < b.first;
}
ll prefix[N];
int up[N][26], result = INF;
int findPos(ll k) {
int l = 1, r = n, mid, pos = 0;
while (l <= r) {
mid = l + r >> 1;
if (a[mid].first <= k) {
l = mid + 1;
pos = mid;
}
else {
r = mid - 1;
}
}
return pos;
}
void build() {
for (int i = 1; i <= n; i++) {
prefix[i] = max(prefix[i - 1], a[i].second);
}
for (int i = 1; i <= n; i++) {
up[i][0] = findPos(prefix[i] + 1);
if (up[i][0] <= i) {
up[i][0] = 0;
}
}
for (int j = 1; j <= 20; j++) {
for (int i = 1; i <= n; i++) {
up[i][j] = up[up[i - 1][j]][j];
}
}
}
int query(pair <ll, ll> target) {
ll u = target.first, v = target.second;
int cur = findPos(u), ans = 0;
if (cur == 0) {
return -1;
}
if (prefix[cur] < u) {
return -1;
}
if (prefix[cur] >= v) {
return 1;
}
for (int i = 20; i >= 0; i--) {
if (up[cur][i] != 0 && prefix[up[cur][i]] < v) {
u = up[cur][i];
ans += (1 << i);
}
}
cur = up[cur][0];
if (cur == 0) {
return -1;
}
ans += 2;
return ans;
}
void solve() {
queries.push_back({0, m - 1});
for (int i = 1; i <= n; i++) {
if (s[i] > e[i]) {
queries.push_back({e[i], e[i] + m - 1});
e[i] += m;
}
a[i] = {s[i], e[i]};
}
sort(a + 1, a + 1 + n, cmp);
build();
for (auto x : queries) {
int ans = query(x);
if (ans == -1) {
continue;
}
result = min(result, ans);
}
if (result == INF) {
result = -1;
}
cout << result;
}
}
int main() {
ios_base :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> s[i] >> e[i];
}
sub6 :: solve();
return 0;
}
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:115:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
115 | freopen(task".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:116:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
116 | freopen(task".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |