#include // ver2.4.5 #include //#include //#include #define fmin brent_find_minima #define int long long #define endl "\n" #define ALL(v) (v).begin(),(v).end() #define Vi vector #define VVi vector #define VVVi vector #define Vm vector #define Vs vector #define Pii pair #define Pdd pair #define VPii vector #define Tiii tuple #define VTiii vector #define PQi priority_queue #define PQir priority_queue,greater> #define pb push_back #define mp make_pair #define mt make_tuple #define itos to_string #define stoi stoll #define FI first #define SE second #define cYES cout<<"YES"<()) #define rep(i,a,b) for(int i=a;i=b;i--) #define dem(a,b) ((a+b-1)/(b)) #define Vin(a) rep(iI,0,a.size())cin>>a[iI] #define INF 3000000000000000000 // 3.0*10^18(MAXの1/3くらい) #define MAX LLONG_MAX #define PI 3.141592653589793238462 #define MOD 1000000007 // 10^9 + 7 using namespace std; /* fmin(f,L,R,100) で関数の最小値を(x,min)で返す */ //using boost::math::tools::brent_find_minima; /* cpp_int (任意の長さのint) */ //using boost::multiprecision::cpp_int; /* デバッグ用 */ void Vout(auto a){if(a.size()==0) cout<<"."<0)cout<0)cerr<n)return 0;if((n-r)n-r;--i){a=a*i;}for(int i=1;in)return 0;if((n-r)n-r;--i){a=a*i%MOD;}for(int i=1; i dep[v]) swap(u,v); for(int i=19;i>=0;i--) { if(((dep[v]-dep[u])>>i)&1) v = parII[v][i]; } if(u==v) return u; for(int i=19;i>=0;i--) { if(parII[u][i] != parII[v][i]){ u = parII[u][i]; v = parII[v][i]; } } return parII[u][0]; } void connect(int a,int b) { memot.pb(mp(a,b)); memot.pb(mp(b,a)); return; } void preset() { sort(ALL(memot)); rep(i,0,memot.size()) treeFI.pb(memot[i].FI); return; } void make(int root) { int st,en,now; int n = par.size(); par = Vi(n,-2); dep = par; chi = VVi(n,Vi(0)); par[root] = -1; dep[root] = 0; queue next; next.push(root); while(!next.empty()){ now = next.front(); next.pop(); st = lower_bound(ALL(treeFI), now)-treeFI.begin(); en = upper_bound(ALL(treeFI), now)-treeFI.begin(); rep(i,st,en){ if(par[memot[i].SE]!=-2) continue; next.push(memot[i].SE); chi[now].pb(memot[i].SE); par[memot[i].SE] = now; dep[memot[i].SE] = dep[now]+1; } } } void makechisize() { int n = par.size(); chisize = Vi(n,0); Vi chinasi(0); rep(i,0,n) if(chi[i].size()==0) chinasi.pb(i); VVi dev(n+5); rep(i,0,n) { dev[dep[i]].pb(i); } repreq(i,n+3,0){ rep(j,0,dev[i].size()){ if(par[dev[i][j]]==-1) continue; chisize[par[dev[i][j]]] += chisize[dev[i][j]]+1; } } return; } void makelongest() { int n = par.size(); longest = Vi(n,-1); Vi chinasi(0); rep(i,0,n) {if(chi[i].size()==0) chinasi.pb(i);} rep(i,0,chinasi.size()){ int now = chinasi[i]; int ct = 0; while(1) { if(longest[now] >= ct) break; else { longest[now] = ct; ct++; if(par[now] == -1) break; now = par[now]; } } } return; } /* 使い方 */ /* TreeAna tree(n) // 宣言 nは頂点数 tree.connect(a,b) // 頂点aとbをつなぐ(0-index) tree.preset(); // 頂点をつなぎ終わったら必ずこれをする!!!!!!! tree.make(k); // 頂点kを根としてpar,dep,chiを作り上げる tree.makechisize(); // 頂点が持つ子の総数の配列 Vi chisize を作り上げる tree.makelongest(); // 頂点から何回下にいけるかのヤツ(Vi longest)を作り上げる tree.set_parII() // lcaを使う前に必ずこれをする!!!!!!! tree.lca(a,b) // 頂点aとbの共通の"先祖"で一番近い"頂点"を返す */ }; signed main() { cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);cout<> n >> k; if(n < k){ cout << -1 << endl; return 0; } cout << k-1 << endl; /* TreeAna tree(n); int qw,er; rep(i,0,n-1){ cin >> qw >> er; qw--,er--; tree.connect(qw,er); } tree.preset(); tree.make(0); int now = 1; queue nex; nex.push(0); while(1){ } */ return 0; }