#include<bits/stdc++.h>
#define endl '\n'
#define pb push_back
using namespace std;
const int maxn = 5e5 + 10;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
int n, m;
int s[maxn], e[maxn];
map < int, int > mp;
vector < int > u;
int t[maxn * 4];
int dp[maxn];
void build(int i, int l, int r)
{
    t[i] = 1e9;
    if(l == r)
    {
        dp[l] = 1e9;
        return;
    }
    int mid = (l + r)/2;
    build(2*i, l, mid);
    build(2*i+1, mid+1, r);
}
int ql, qr;
int query(int i, int l, int r)
{
    if(qr < l || ql > r)return 1e9;
    if(ql <= l && r <= qr)return t[i];
    int mid = (l + r)/2;
    return min(query(2*i, l, mid), query(2*i+1, mid+1, r));
}
int upos, uval;
void update(int i, int l, int r)
{
    if(l == r)
    {
        dp[l] = min(dp[l], uval);
        t[i] = min(t[i], uval);
        return;
    }
    int mid = (l + r)/2;
    if(upos <= mid)update(2*i, l, mid);
    else update(2*i+1, mid+1, r);
    t[i] = min(t[2*i], t[2*i+1]);
   // cout << endl;
   // cout << t[i] << endl;
}
vector < int > g[maxn];
int main()
{
    speed();
    cin >> n >> m;
    for (int i = 1; i <= n; ++ i)
    {
        cin >> s[i] >> e[i];
        if(!e[i])e[i] = m;
        u.pb(s[i]-1);
        u.pb(e[i]);
    }
    u.pb(-1);
    u.pb(0);
    u.pb(m);
    sort(u.begin(), u.end());
    int last = -2, cnt = 0;
    for (auto x: u)
    {
        if(last != x)
        {
          //  cout <<  x << " is transf to " << cnt << endl;
            mp[x] = cnt;
            cnt ++;
        }
        last = x;
    }
    for (int i = 1; i <= n; ++ i)
    {
        int l = mp[s[i]-1];
        int r = mp[e[i]];
       // cout << s[i]-1 << " ---> " << mp[s[i]-1] << endl;
        g[r].pb(l);
    }
    int lt = mp[0], rt = mp[m];
    int l = mp[-1];
    build(1, l, rt);
    dp[l] = 0;
    upos = l;
    uval = 0;
    update(1, l, rt);
    for (int i = lt; i <= rt; ++ i)
    {
       // cout << "left border " << endl;
        for (auto st: g[i])
        {
           // cout << st << endl;
            ql = st;
            qr = i;
            int val = query(1, l, rt);
           // cout << "^^^^^ " << val << endl;
            dp[i] = min(dp[i], val + 1);
            uval = dp[i];
            upos = i;
            update(1, l, rt);
        }
       // cout << "dp[i] with i = " << i << " is " << dp[i] << endl;
    }
    if(dp[rt] == 1e9)cout << -1 << endl;
    else cout << dp[rt] << endl;
    return 0;
}
| # | 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... |