#include <cstdio>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <limits.h>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <deque>
#include <map>
#include <chrono>
#include <random>
#include <bitset>
#include <tuple>
#include "game.h"
#define SZ(x) (LL)(x.size())
#define FR(i,a,b) for(LL i=(a);i<(b);++i)
#define FOR(i,n) FR(i,0,n)
#define FAST ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define A first
#define B second
#define mp(a,b) make_pair(a,b)
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
typedef unsigned __int128 U128;
typedef __int128 I128;
typedef std::pair<int,int> PII;
typedef std::pair<LL,LL> PLL;
using namespace std;
int n,k;
const int MAXN=1003;
vector<int> adj[MAXN];
vector<int> radj[MAXN];
int l[MAXN], r[MAXN]; //leftmost one i can reach, rightmost one can reach i
bool can=false;
void dfs(int u){
if (l[u]<=r[u]){
can=true;
return;
}
for (int v:adj[u]){
if (r[u]>r[v]){
r[v]=max(r[u],r[v]);
dfs(v);
if (can) return;
}
}
}
void rdfs(int u, int val){
if (l[u]<=r[u]){
can=true;
return;
}
for (int v:radj[u]){
if (l[v]>val){
l[v]=min(l[v],val);
rdfs(v,val);
if (can) return;
}
}
}
void init(int N, int K) {
n=N;
k=K;
FOR(i,k){
if (i==k-1) l[i]=n+1;
else l[i]=i+1;
r[i]=i;
}
FR(i,k,n){
l[i]=n+1;
r[i]=-1;
}
FOR(i,k-1){
adj[i].push_back(i+1);
radj[i+1].push_back(i);
}
}
int add_teleporter(int u, int v) {
if (u==v){
if (u<k) return 1;
else return 0;
}
adj[u].push_back(v);
radj[v].push_back(u);
if (l[u]>l[v]){
int val=l[v];
if (v<k) val=v;
rdfs(v,val);
}
if (r[u]>r[v]) dfs(u);
/*FOR(i,n) cout<<l[i]<<" ";
cout<<"\n";
FOR(i,n) cout<<r[i]<<" ";
cout<<"\n";*/
if (can) return 1;
return 0;
}