rt,这个萌新他查不出错/kk
只有5分,而且len的确是离散化前的值
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 500000
#define debug puts("qaq")
struct TREE{
int l,r;
int maxn,lazy;
}tree[4*MAXN+5];
struct LINE{
int len,p;
}input[MAXN+5];
struct node{
int v,p;
}qaq[2*MAXN+5];
int n,m;
int sum;
int ans=0x3f3f3f3f;
int nl[MAXN],nr[MAXN];
inline int max(int a,int b){
return a>b?a:b;
}
inline int min(int a,int b){
return a<b?a:b;
}
bool cmp1(node _1,node _2){
return _1.v<_2.v;
}
bool cmp2(LINE _1,LINE _2){
return _1.len<_2.len;
}
void pushdown(int id){
if (tree[id].lazy){
tree[id<<1].maxn+=tree[id].lazy;
tree[id<<1|1].maxn+=tree[id].lazy;
tree[id<<1].lazy+=tree[id].lazy;
tree[id<<1|1].lazy+=tree[id].lazy;
tree[id].lazy=0;
return;
}
}
void pushup(int id){
tree[id].maxn+=max(tree[id<<1].maxn,tree[id<<1|1].maxn);
}
void build(int id,int l,int r){
tree[id].l=l;
tree[id].r=r;
tree[id].maxn=0;
if (l==r){
return;
}
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
}
void update(int id,int l,int r,int x){
// if (x==1){
// printf("%d %d\n",tree[id].l,tree[id].r);
// }
if (l>tree[id].r||r<tree[id].l){
return;
}
if (l<=tree[id].l&&r>=tree[id].r){
tree[id].maxn+=x;
tree[id].lazy+=x;
return;
}
int mid=(tree[id].l+tree[id].r)>>1;
pushdown(id);
update(id<<1,l,r,x);
update(id<<1|1,l,r,x);
pushup(id);
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
int l,r;
scanf("%d%d",&l,&r);
input[i].len=r-l;
input[i].p=i;
qaq[i*2-1].v=l;
qaq[i*2-1].p=i;
qaq[i*2].v=r;
qaq[i*2].p=i;
}
sort(qaq+1,qaq+2*n+1,cmp1);
qaq[0].v=-1;
for (int i=1;i<=2*n;i++){
if (qaq[i].v!=qaq[i-1].v){
int now=qaq[i].p;
if (!nl[now]){
nl[now]=++sum;
}
else{
nr[now]=++sum;
}
}
}
build(1,1,sum);
sort(input+1,input+n+1,cmp2);
int st=1;
for (int i=1;i<=n;i++){
int now=input[i].p;
// debug;
update(1,nl[now],nr[now],1);
// printf("%d\n",tree[1].maxn);
while(tree[1].maxn==m){
update(1,nl[st],nr[st],-1);
ans=min(ans,input[i].len-input[st++].len);
}
}
if (ans==0x3f3f3f3f){
printf("-1");
}
else{
printf("%d",ans);
}
return 0;
}