#include <bits/stdc++.h>
using namespace std;
/*
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
*/
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;
typedef pair<pll,ll> ppl;
struct S{
ll L,R,x;
};
S a[100009];
ll n,k,dp[100009][25],h,r[100009],mod,c;
struct Tree{
pll T[800009];
void init(){
for(int i=0;i<=4*c;i++) T[i]={c,2};
}
void add(int v,int tl,int tr,int t){
if(T[v].first>a[t].R){
T[v]={a[t].R,a[t].x};
}
if(tl==tr) return;
int tm=(tl+tr)>>1;
if(a[t].L<=tm) add(2*v+1,tl,tm,t);
else add(2*v+2,tm+1,tr,t);
}
pll get(int v,int tl,int tr,int R){
//cout<<v<<" "<<tl<<" "<<tr<<" "<<R<<" "<<T[v].first<<" "<<T[v].second<<endl;
if(R<=tl) return T[v];
if(tr<R) return {c,2};
int tm=(tl+tr)>>1;
pll G=get(2*v+1,tl,tm,R);
pll H=get(2*v+2,tm+1,tr,R);
if(G.first<=H.first) return G;
else return H;
}
void add(int t){
add(0,1,c,t);
}
pll get(int R){
// cout<<"? "<<R<<endl;
return get(0,1,c,R);
}
};
Tree D;
bool cmp(S w,S u){
if(w.L!=u.L) return w.L<u.L;
if(w.R!=u.R) return w.R<u.R;
return w.x>u.x;
}
vector<ll> B;
map<ll,ll> mp;
ll res;
set<ppl> s;
ll f(){
ll o=0;
ll v=1;
while(1){
o++;
if(v==2) break;
v=dp[v][0];
}
return o;
}
ll f(ll tL,ll tR){
ll sum=0;
ll v=tL;
for(int i=h;i>=0;i--){
if(a[r[dp[v][i]]].R<=a[r[tR]].L) {
sum+=(1LL<<i);
v=dp[v][i];
}
}
return sum;
}
set<ll> ans;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
mod=1e9+7;
h=22;
cin>>n>>k;
n+=2; k+=2;
a[1]={0,0,1};
B.push_back(0);
a[2]={mod,mod,2};
B.push_back(mod);
for(int i=3;i<=n;i++) {cin>>a[i].L>>a[i].R; B.push_back(a[i].L); B.push_back(a[i].R); a[i].x=i;}
sort(B.begin(),B.end());
for(auto x:B){
c++;
mp[x]=c;
}
for(int i=1;i<=n;i++){
a[i].R=mp[a[i].R];
a[i].L=mp[a[i].L];
}
sort(a+1,a+n+1,cmp);
/* for(int i=1;i<=n;i++) {
cout<<a[i].L<<" "<<a[i].R<<" "<<a[i].x<<endl;
}*/
for(int i=1;i<=n;i++) r[a[i].x]=i;
for(int i=0;i<=h;i++) dp[2][i]=2;
D.init();
D.add(n);
for(int i=n-1;i>=1;i--){
dp[a[i].x][0]=D.get(a[i].R).second;
D.add(i);
for(int j=1;j<=h;j++) dp[a[i].x][j]=dp[dp[a[i].x][j-1]][j-1];
}
//for(int i=1;i<=n;i++) cout<<i<<" "<<dp[i][0]<<endl;
s.insert({{a[1].L,a[1].R},a[1].x});
s.insert({{a[n].L,a[n].R},a[n].x});
res=f();
if(res<k) {
cout<<"-1\n";
return 0;
}
for(int i=3;i<=n;i++){
auto id=s.lower_bound({{a[r[i]].R,a[r[i]].R},0});
auto id2=prev(id);
ppl G=*id;
ppl H=*id2;
if(a[r[H.second]].R>a[r[i]].L || a[r[G.second]].L<a[r[i]].R) continue;
ll P=res-f(H.second,G.second)+f(H.second,i)+f(i,G.second)+1;
if(P>=k) {
res=P;
s.insert({{a[r[i]].L,a[r[i]].R},a[r[i]].x});
if(s.size()==k) break;
}
}
for(auto x:s) ans.insert(x.second-2);
for(auto x:ans) if(x>0) cout<<x<<"\n";
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... |