/*
思路分析
声明结构体node s表示值班开始时间 e表示值班结束时间
声明node类型数组a last表示上一次安排值班奶牛的区间
声明int类型变量 奶牛数n 时段数t 最终值班奶牛数cnt 标记数组book
输入奶牛数n 时段数t
循环n次
输入每头奶牛的值班区间
存入结构体数组中
标记值班的每个时段
遍历book数组`1~t 循环变量i
如果 book[i]没被标记
输出-1
结束程序
将每头奶牛的值班结束的时间从大到小排序
循环直到last.e>=t
遍历整个结构体数组1~n
如果当前奶牛的起点满足>=last.s+1且<=last.e+1
将last赋值为当前奶牛的区间
cnt++
退出循环
输出cnt
*/
#include <bits/stdc++.h>
using namespace std;
struct node
{
int s,e;
}a[100005],last;
bool cmp(node x,node y)
{
if(x.e>=y.e)return true;
return false;
}
int n,t,cnt,book[100005];
int main()
{
last.s=0,last.e=0;
cin>>n>>t;
for(int i=1;i<=n;i++)
{
cin>>a[i].s>>a[i].e;
for(int j=a[i].s;j<=a[i].e;j++)
{
book[j]=1;
}
}
for(int i=1;i<=t;i++)
{
if(book[i]==0)
{
cout<<-1;
return 0;
}
}
sort(a+1,a+n+1,cmp);
while(last.e<t)
{
for(int i=1;i<=n;i++)
{
if(a[i].s>=last.s+1&&a[i].e<=last.e+1)
{
last.s=a[i].s,last.e=a[i].e;
cnt++;
break;
}
}
}
cout<<cnt;
return 0;
}