D:
#include<cstdio> #include<cstring> #include<map> #include<algorithm> #define fi first #define se second using namespace std; const int MAXN=3e5+5; struct interval { int l,r,id; bool operator < (const interval& rhs)const { return l==rhs.l?r<rhs.r:l<rhs.l; } }p[MAXN]; int x[MAXN<<2],rf[MAXN<<1],sum[MAXN<<1]; int query(int pos) { int res=0; for(int i=pos;i>0;i-=i&(-i)) res+=sum[i]; return res; } void update(int pos,int sz) { for(int i=pos;i<=sz;i+=i&(-i)) sum[i]++; } map<int,int>f; int main() { int n,k,tot=1; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d%d",&p[i].l,&p[i].r),f[p[i].l]++,f[p[i].r]++,p[i].id=i; for(map<int,int>::iterator i=f.begin();i!=f.end();i++) i->se=tot,rf[tot]=i->fi,tot++; int sz=f.size(); sort(p+1,p+n+1); for(int i=1;i<=n;i++) { x[f[p[i].l]]++; x[f[p[i].r]+sz]++; } int flag,mxlen=0; for(int i=1,j=1,cnt=0;i<=sz;i++) { cnt+=x[i]; while(f[p[j].l]==i) update(f[p[j].r],sz),j++; if(cnt>=k&&x[i]>0) { int l=i-1,r=sz+1; while(r-l>1) { int mid=(l+r)/2; if(cnt-(query(mid)-query(i-1))<k) r=mid; else l=mid; } if(rf[r]-rf[i]+1>mxlen) flag=i,mxlen=rf[r]-rf[i]+1; } cnt-=x[sz+i]; } printf("%d ",mxlen); if(mxlen==0) { for(int i=1;i<=k;i++) printf("%d ",i); return 0; } int L=rf[flag],R=rf[flag]+mxlen-1; for(int cnt=0,i=1;i<=n&&cnt<k;i++) if(p[i].l<=L&&p[i].r>=R) printf("%d ",p[i].id),cnt++; return 0; }