#include<bits/stdc++.h>
using namespace std;
#define x_lc (x<<1)
#define x_rc (x<<1|1)
#define x_mid ((t[x].l+t[x].r)>>1)
int num[2000001];
map<int,int> p;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
struct line{
int l,r;
vector<int> cnt;
int leng(){
return r-l;
}
};
bool cmp(line l1,line l2){
return l1.leng()<l2.leng();
}
struct tree{
int add;
int data;
int l,r;
int leng(){
return r-l+1;
}
};
tree t[5000001];
line ln[800001];
int maxn,n=read(),m=read();
int res=(1<<30);
void build(int x,int l,int r){
t[x].add=0;
t[x].l=l;
t[x].r=r;
t[x].data=0;
if(l<r){
build(x_lc,l,x_mid);
build(x_rc,x_mid+1,r);
}
}
void spread(int x){
int y=t[x].add;
t[x_lc].add+=y;
t[x_rc].add+=y;
t[x_lc].data+=y;
t[x_rc].data+=y;
t[x].add=0;
}
void add(int x,int l,int r){
if(t[x].l>=l&&t[x].r<=r){
t[x].data++;
t[x].add++;
return;
}
spread(x);
if(x_mid>=l) add(x_lc,l,r);
if(x_mid+1<=r) add(x_rc,l,r);
t[x].data=max(t[x_lc].data,t[x_rc].data);
}
void cut(int x,int l,int r){
if(t[x].l>=l&&t[x].r<=r){
t[x].data--;
t[x].add--;
return;
}
spread(x);
if(x_mid>=l) cut(x_lc,l,r);
if(x_mid+1<=r) cut(x_rc,l,r);
t[x].data=max(t[x_lc].data,t[x_rc].data);
}
int finds(int x,int l,int r){
if(t[x].l>=l&&t[x].r<=r)
return t[x].data;
spread(x);
int y=-1;
if(x_mid>=l) y=max(y,finds(x_lc,l,r));
if(x_mid+1<=r) y=max(y,finds(x_rc,l,r));
return y;
}
int main(){
for(int i=1;i<=n;i++){
ln[i].l=read();
ln[i].r=read();
num[i]=ln[i].l;
num[i+n]=ln[i].r;
}
sort(ln+1,ln+n+1,cmp);
sort(num+1,num+2*n+1);
unique(num+1,num+2*n+1);
for(int i=1;i<=2*n;i++){
if(num[i]<=num[i-1])
break;
p[num[i]]=i;
maxn=i;
}
build(1,1,maxn);
for(int l=1,r=1;r<=n;r++){
add(1,p[ln[r].l],p[ln[r].r]);
while(finds(1,1,maxn)>=m){
res=min(res,ln[r].leng()-ln[l].leng());
cut(1,p[ln[l].l],p[ln[l].r]);
l++;
}
}
if(res==(1<<30)) cout<<-1;
else cout<<res;
return 0;
}