Problem:
E: 札 / Fuda
この問題はリアクティブ問題です。
サーバー側に用意されたプログラムと対話的に応答することで正答を導くプログラムを作成する必要があります。
問題文
湖に浮かぶ $N$ 個の小島からなるビワコという村がある。
各小島には $0$ から $N-1$ まで番号が振られている。
村には島と島の間に架かる橋が $M$ 本あり、$0$ から $M-1$ まで番号が振られている。
橋は双方向に移動可能である。
ここで言う橋とは単に島と島の間の通り道ということであり、取り除くと互いに到達不可能な島の組が増える意味ではない。
最近、橋の両端に掲示板を設置し、その橋を渡った先の島から橋を $1$ 本だけ使って移動できる島 (今いる島を含まない) の番号の書かれた札を貼ることで、
スムーズな移動を実現する計画が持ち上がった。
一枚の札には一つの移動先しか書くことが出来ないため、移動できる島の数だけ札が必要になる。
この札の作成を命じられたあなたは、札は全部で何枚必要かを調べることにした。
村には、かつて全ての橋を架けた橋職人がいる。
また、各島にはその島に住んでいる村人がいる。
村は広大で全ての掲示板を見て回るのは骨が折れるため、本部から電話で彼らに質問をすることで必要な札の枚数を求めることにした。
橋職人への質問では、まず、何番の橋の情報が知りたいかを橋職人に伝える。
すると、どの島とどの島の間に該当する橋を架けたかを確実に教えてくれる (edgクエリ)。
住人への質問では、まず聞きたい島の番号$i$を伝える。
すると、島 $i$ にかかる橋の数とその橋がどこにかかっているかを教えてくれる (lst クエリ)。
しかし、貧弱な通信網を使用しているため、各橋に対して、80% の確率で情報が抜け落ちてしまう。
札の発注まで時間がないので全体で多くても $3N$ 回しか質問ができない。
以上の条件のもとで、必要な札の数を求めるプログラムを書きなさい。
入出力仕様
以降では、あなたが提出したプログラムを「解答」、ジャッジ側が用意したプログラムを「ジャッジ」と呼ぶ。
入出力の詳細な仕様を以下に示すが、先にサンプルを見ると速い。
島と橋の数
ジャッジは、まず島の数 $N$ と橋の数の合計 $M$ を $1$ 行に出力する。
N M
続いて、解答は edg, lst クエリを最大 $3N$ 回、 ans をちょうど 1 回ジャッジに対して送ることができる。
edg クエリ
解答の edg クエリに対し、ジャッジは橋$i$の両端の島の番号を答える。解答は次の形式で出力せよ。
edg i
これに対して、ジャッジは次の形式で応答する。
a b
$a$, $b$ は橋 $i$ が結ぶ島の番号である。
lst クエリ
解答の lst クエリに対し、ジャッジは小島 $i$ にかかる橋の本数と、それぞれの橋の行き先の島の番号を答える。解答は次の形式で出力せよ。
lst i
これに対して、ジャッジは次の形式で応答する。
k v1 v2 v3 … vk
$k$ は島 $i$ にかかる橋の数である。
続く $v_1 \cdots v_k$ は頂点$i$から橋を一度だけ使って移動可能な頂点の番号のリストである。
各橋の行き先 $v_j$ に対し、$v_j \ge 0$ の場合はその情報がしっかり伝わったことを表す。$v_j = -1$ の場合は情報が抜け落ちていることを表す。
$-1$ かどうかは乱数で決められ、80% の確率で $-1$ となる。したがって、同じ $i$ に対して複数回このクエリを実行すると、結果は変わりうる。また、順番も不定である。
ans クエリ
解答の ans クエリによって、答えを出力できる。このクエリは 1 度しか行うことが出来ず、結果が正しくない場合は直ちに誤答となる。
このクエリの実行後に、解答は直ちに正常終了せよ。 $X$ を答えとして出力したい場合の形式は以下の通りである。
ans X
制約と注意
$1 \le N \le 100$
$0 \le M \le N(N-1)/2$
橋は異なる 2 つの島の間に架かっている。
異なる橋が、同じ 2 つの島を結ぶことはない。
ans 以外のクエリは高々 $3N$ 回しか投げられない。
ジャッジプログラムの出力は全て $1$ 行かつスペース区切りの整数からなる。
仕様に従わない出力の結果は不定である。
解答はジャッジの応答をすぐに標準入力で受け取らなければならない。
解答はクエリを出力した直後にバッファを空にせよ。最小の解答プログラム例を下に示す。C、C++以外の言語は各自で調べてほしい。
C
#include <stdio.h>
int main(){
    int n,m;
    scanf("%d %d", & n, &m);
    printf("ans 100\n"); // 答えをジャッジに提出
    fflush(stdout); // フラッシュ
    return 0;
}
C++
#include <iostream>
using namespace std;
int main(){
    int n,m;
    cin >> n >> m;
    cout << "ans 100" << endl; // 改行直後にフラッシュ
    // cout << "ans 100\n" << flush; // 上と同じ
}
サンプル
解答プログラムとジャッジプログラムの入出力例を以下に示す。
問題文の図中の村に対する答えを求めている。

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;
#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define rep(i,n) repl(i,0,n)
#define mp(a,b) make_pair((a),(b))
#define pb(a) push_back((a))
#define all(x) (x).begin(),(x).end()
#define uniq(x) sort(all(x)),(x).erase(unique(all(x)),end(x))
#define fi first
#define se second
#define dbg(x) cout<<#x" = "<<((x))<<endl
template<class T,class U> ostream& operator<<(ostream& o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream& o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

#define INF 21474836

int main(){
  int n,m;
  cin>>n>>m;

  vector<vector<int>> vec(n, vector<int>(n,0));

  if(3*n >=m){
    rep(i,m){
      cout << "edg " << i << endl;
      int u,v;
      cin>>u>>v;
      vec[u][v]=1;
      vec[v][u]=1;
    }
  }
  else {
    vector<int> k(n);
    vector<int> hoge(n,0); // ?????\????????°

    rep(i,n){
      cout << "lst " << i << endl;
      cin>>k[i];
      rep(_,k[i]){
        int d; cin>>d;
        if(d==-1) hoge[i]++;
        else {
          vec[i][d]=1;
        }
      }
    }

    rep(i,n)rep(j,i) if(vec[i][j] != vec[j][i]){
      if(vec[i][j]==0){
        vec[i][j] = 1;
        hoge[i]--;
      } else {
        vec[j][i] = 1;
        hoge[j]--;
      }
    }

    int cnt = 2*n;

    priority_queue<pair<int,int>> pq;

    rep(i,n) if(hoge[i]>0) pq.push(mp(hoge[i], i));

    while(!pq.empty() || cnt>0){
      int i = pq.top().se; pq.pop();
      if(hoge[i]==0) continue;
      
      cout << "lst " << i << endl;
      cin>>k[i];
      rep(__,k[i]){
        int d; cin>>d;
        if(d==-1) continue;
        else {
          if(vec[i][d]==0) hoge[i]--;
          vec[i][d]=1;
          if(vec[d][i]==0) hoge[d]--;
          vec[d][i]=1;
        }
      }
      cnt--;
      if(hoge[i]>0) pq.push(mp(hoge[i], i));
    }
  }

  vector<vector<int>> &d = vec;
  rep(i,n) rep(j,n) if(i!=j && d[i][j]==0) d[i][j] = INF;
  rep(i,n) d[i][i]=0;

  rep(kk,n)rep(i,n)rep(j,n) d[i][j] = min(d[i][j], d[i][kk] + d[kk][j]);

  int ans =0;
  rep(i,n) rep(j,n) if(d[i][j]==2) ans++;

  cout << "ans " << ans << endl;

  return 0;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3040
final_rank: 8

code_snippet: #include <bits/stdc++.h>
using namespace std;
#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define rep(i,n) repl(i,0,n)
#define mp(a,b) make_pair((a),(b))
#define pb(a) push_back((a))
#define all(x) (x).begin(),(x).end()
#define uniq(x) sort(all(x)),(x).erase(unique(all(x)),end(x))
#define fi first
#define se second
#define dbg(x) cout<<#x" = "<<((x))<<endl
template<class T,class U> ostream& operator<<(ostream& o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream& o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

#define INF 21474836

int main(){
  int n,m;
  cin>>n>>m;

  vector<vector<int>> vec(n, vector<int>(n,0));
  vector<int> k(n);
  vector<int> hoge(n,0); // ?????\????????°

  if(3*n >=m){
    rep(i,m){
      cout << "edg " << i << endl;
      int u,v;
      cin>>u>>v;
      if(vec[u][v]==0){
        vec[u][v]=1;
        vec[v][u]=1;
        hoge[u]--;
        hoge[v]--;
      }
    }
  }
  else {
    rep(i,n){
      cout << "lst " << i << endl;
      cin>>k[i];
      rep(_,k[i]){
        int d; cin>>d;
        if(d==-1)hoge[i]++;
        else {
          vec[i][d]=1;
        }
      }
    }

    rep(i,n)rep(j,i) if(vec[i][j] != vec[j][i]){
      if(vec[i][j]==0){
        vec[i][j] = 1;
        hoge[i]--;
      } else {
        vec[j][i] = 1;
        hoge[j]--;
      }
    }

    int cnt = 2*n;

    priority_queue<pair<int,int>> pq;

    rep(i,n) if(hoge[i]>0) pq.push(mp(hoge[i], i));

    while(!pq.empty() || cnt>0){
      int i = pq.top().se; pq.pop();
      cout << "lst " << i << endl;
      cin>>k[i];
      rep(__,k[i]){
        int d; cin>>d;
        if(d==-1) continue;
        else {
          if(vec[i][d]==0) hoge[i]--;
          vec[i][d]=1;
          if(vec[d][i]==0) hoge[d]--;
          vec[d][i]=1;
        }
      }
      cnt--;
      if(hoge[i]>0) pq.push(mp(hoge[i], i));
    }
  }

  vector<vector<int>> &d = vec;
  rep(i,n) rep(j,n) if(i!=j && d[i][j]==0) d[i][j] = INF;
  rep(i,n) d[i][i]=0;

  rep(kk,n)rep(i,n)rep(j,n) d[i][j] = min(d[i][j], d[i][kk] + d[kk][j]);

  int ans =0;
  rep(i,n) rep(j,n) if(d[i][j]==2) ans++;

  cout << "ans " << ans << endl;

  return 0;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3072
final_rank: 9

code_snippet: #include <bits/stdc++.h>
using namespace std;
#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define rep(i,n) repl(i,0,n)
#define mp(a,b) make_pair((a),(b))
#define pb(a) push_back((a))
#define all(x) (x).begin(),(x).end()
#define uniq(x) sort(all(x)),(x).erase(unique(all(x)),end(x))
#define fi first
#define se second
#define dbg(x) cout<<#x" = "<<((x))<<endl
template<class T,class U> ostream& operator<<(ostream& o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream& o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

#define INF 21474836

int main(){
  int n,m;
  cin>>n>>m;

  vector<vector<int>> vec(n, vector<int>(n,0));
  vector<int> k(n);
  vector<int> hoge(n,0); // ?????\????????°

  rep(i,n){
    cout << "lst " << i << endl;
    cin>>k[i];
    rep(_,k[i]){
      int d; cin>>d;
      if(d==-1)hoge[i]++;
      else {
        vec[i][d]=1;
      }
    }
  }

  rep(i,n)rep(j,i) if(vec[i][j] != vec[j][i]){
    if(vec[i][j]==0){
      vec[i][j] = 1;
      hoge[i]--;
    } else {
      vec[j][i] = 1;
      hoge[j]--;
    }
  }

  int cnt = 2*n;

  rep(_,100){
    rep(i,n) if(cnt>0 && hoge[i]>0){
      cout << "lst " << i << endl;
      cin>>k[i];
      rep(__,k[i]){
        int d; cin>>d;
        if(d==-1) continue;
        else {
          if(vec[i][d]==0) hoge[i]--;
          vec[i][d]=1;
          if(vec[d][i]==0) hoge[d]--;
          vec[d][i]=1;
        }
      }
      cnt--;
    }
  }

  vector<vector<int>> &d = vec;
  rep(i,n) rep(j,n) if(i!=j && d[i][j]==0) d[i][j] = INF;
  rep(i,n) d[i][i]=0;

  rep(kk,n)rep(i,n)rep(j,n) d[i][j] = min(d[i][j], d[i][kk] + d[kk][j]);

  int ans =0;
  rep(i,n) rep(j,n) if(d[i][j]==2) ans++;

  cout << "ans " << ans << endl;

  return 0;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3140
final_rank: 13

code_snippet: #include<bits/stdc++.h>
using namespace std;
int main(){
  int n,m,i,j,k,c=0,d=0,ans=0;
  cin>>n>>m;
  int s=0,t=2*n+1;

  for(i=0;i<n;i++){
    cout << "lst " << i << endl;
    cin >> k;
    ans+=k*(k-1);
    for(j=0;j<k;j++) cin >> c;
  }

  cout << "ans "<< ans << endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1280
final_rank: 2

code_snippet: #include <bits/stdc++.h>
using namespace std;

int main(){
  int n,m,k;
  int ans = 0;
  cin >> n >> m;
  for(int i = 0;i<n;i++){
    cout << "lst " << i << endl;
    cin >> k;
    for(int j =0;j<k;j++) cin >> m;
    ans += k*(k-1);
  }
  cout << "ans " << ans << endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1280
final_rank: 2

code_snippet: #include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_set>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#include<cassert>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define reps(X,S,Y) for (int (X) = S;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<class T> using vv=vector<vector<T>>;
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class T> inline bool MX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool MN(T &l,const T &r){return l>r?l=r,1:0;}
const ll MOD=1e9+7;

int d[112][112];

int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
  int n,m;
  cin>>n>>m;
  vv<int> g(n);
  if(m>3*n){
    rep(i,n){
      cout<<"lst "<<i<<endl;
      int t;
      cin>>t;
      unordered_set<int> st;
      int hoge=0;
      while(st.size()<t){
	if(hoge){      cout<<"lst "<<i<<endl;
cin>>hoge;
	}
	hoge=1;
	rep(j,t){
	  int x;
	  cin>>x;
	  if(x>=0)
	    st.insert(x);
	}
      }
      for(int x:st) g[i].pb(x);
    }
    assert(0);
  }else{
    rep(i,m){
      cout<<"edg "<<i<<endl;
      int x,y;
      cin>>x>>y;
      g[x].pb(y);
      g[y].pb(x);
    }
  }
  //cout<<g;
  ll re=0;
  rep(i,n) for(int v:g[i]) re+=g[v].size()-1;
  cout<<"ans "<<re<<endl;
  return 0;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3080
final_rank: 10

code_snippet: #include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_set>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#include<cassert>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define reps(X,S,Y) for (int (X) = S;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<class T> using vv=vector<vector<T>>;
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class T> inline bool MX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool MN(T &l,const T &r){return l>r?l=r,1:0;}
const ll MOD=1e9+7;

int d[112][112];

int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
  int n,m;
  cin>>n>>m;
  vv<int> g(n);
  if(m>3*n){
    rep(i,n){
      cout<<"lst "<<i<<endl;
      int t;
      cin>>t;
      unordered_set<int> st;
      int hoge=0;
      while(st.size()<t){
	if(hoge){      cout<<"lst "<<i<<endl;
cin>>hoge;
	}
	hoge=1;
	rep(j,t){
	  int x;
	  cin>>x;
	  if(x>=0)
	    st.insert(x);
	}
      }
      for(int x:st) g[i].pb(x);
    }
  }else{
    rep(i,m){
      cout<<"edg "<<i<<endl;
      int x,y;
      cin>>x>>y;
      g[x].pb(y);
      g[y].pb(x);
    }
  }
  //cout<<g;
  ll re=0;
  rep(i,n) for(int v:g[i]) re+=g[v].size()-1;
  cout<<"ans "<<re<<endl;
  return 0;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3172
final_rank: 14

code_snippet: #include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_set>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#include<cassert>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define reps(X,S,Y) for (int (X) = S;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<class T> using vv=vector<vector<T>>;
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class T> inline bool MX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool MN(T &l,const T &r){return l>r?l=r,1:0;}
const ll MOD=1e9+7;

int d[112][112];

int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
  int n,m;
  cin>>n>>m;
  vv<int> g(n);
  if(m>3*n){
    rep(i,n){
      cout<<"lst "<<i<<endl;
      int t;
      cin>>t;
      unordered_set<int> st;
      int hoge=0;
      while(st.size()<t){
	if(hoge){      cout<<"lst "<<i<<endl;
cin>>hoge;
	}
	hoge=1;
	rep(j,t){
	  int x;
	  cin>>x;
	  st.insert(x);
	}
      }
      for(int x:st) g[i].pb(x);
    }
  }else{
    rep(i,m){
      cout<<"edg "<<i<<endl;
      int x,y;
      cin>>x>>y;
      g[x].pb(y);
      g[y].pb(x);
    }
  }
  //cout<<g;
  ll re=0;
  rep(i,n) for(int v:g[i]) re+=g[v].size()-1;
  cout<<"ans "<<re<<endl;
  return 0;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3100
final_rank: 11

code_snippet: #include<bits/stdc++.h>
using namespace std;
#define MAX_V 110
int INF = 1 << 28;
struct edge{int to,cap,rev;};
vector<edge> G[MAX_V*2+2];
bool used[MAX_V*2+2];
void add_edge(int from,int to,int cap){
  G[from].push_back((edge){to,cap,G[to].size()});
  G[to].push_back((edge){from,0,G[from].size()-1});
}

int dfs(int v,int t,int f){
  if(v==t) return f;
  used[v]=true;
  for(int i=0;i<G[v].size();i++){
    edge &e = G[v][i];
    if(!used[e.to] && e.cap > 0 ){
      int d=dfs(e.to,t,min(f,e.cap));
      if(d>0){
	e.cap-=d;
	G[e.to][e.rev].cap+=d;
	return d;
      }
    } 
  }
  return 0;
}

int max_flow(int s,int t){
  int flow=0;
  for(;;){
    memset(used,0,sizeof(used));
    int f=dfs(s,t,INF);
    if(f==0) return flow;
    flow+=f;
  }
}

int x[MAX_V][MAX_V];
int ans=0;

void dfs2(int c,int v,int d){
  if(used[v]) return;
  used[v]=true;
  if(d==2){ 
    if(c!=v) ans++;
  }else{
    for(int i=0;i<MAX_V;i++){
      if(x[v][i]) dfs2(c,i,d+1);
    }
  }
}

int main(){
  int n,m,i,j,k,c=0,d=0;
  cin>>n>>m;
  int s=0,t=2*n+1;

  for(i=1;i<=n;i++){
    for(j=n+1;j<=n*2;j++){
      if(j-i==n) continue;
      add_edge(i,j,1);
    } 
  }

  for(i=0;i<n;i++){
    cout << "lst " << i << endl;
    cin >> k;
    add_edge(s,i+1,k);
    add_edge(n+i+1,t,k);
    for(j=0;j<k;j++) cin >> c;
  }

  for(i=1;i<=n;i++){
    for(j=n+1;j<=n*2;j++){
      if(j-i==n) continue;
      add_edge(i,j,1);
    } 
  }
  int e=max_flow(s,t);
  
  memset(x,0,sizeof(x));
  for(i=0;i<n;i++){
    for(j=0;j<G[i+1].size();j++){
      if(G[i+1][j].cap==0) x[G[i+1][j].to-n-1][i]=1;
    }
  }
  for(i=0;i<n;i++) memset(used,0,sizeof(used)),dfs2(i,i,0);
  cout << "ans "<< ans << endl;
  return 0;
}
accuracy: 0.024390243902439025
time_ms: 80
memory_kb: 1796
final_rank: 17

code_snippet: #include <string>
#include <vector>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
#include<functional>
#include<list>
#include<deque>
#include<bitset>
#include<set>
#include<map>
#include<unordered_map>
#include<cstring>
#include<sstream>
#include<complex>
#include<iomanip>
#include<numeric>
#include<cassert>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define reps(X,S,Y) for (int (X) = S;(X) < (Y);++(X))
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define repe(X,Y) for ((X) = 0;(X) < (Y);++(X))
#define peat(X,Y) for (;(X) < (Y);++(X))
#define all(X) (X).begin(),(X).end()
#define rall(X) (X).rbegin(),(X).rend()
#define eb emplace_back
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
template<class T> using vv=vector<vector<T>>;
template<class T> ostream& operator<<(ostream &os, const vector<T> &t) {
os<<"{"; rep(i,t.size()) {os<<t[i]<<",";} os<<"}"<<endl; return os;}
template<class S, class T> ostream& operator<<(ostream &os, const pair<S,T> &t) { return os<<"("<<t.first<<","<<t.second<<")";}
template<class T> inline bool MX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool MN(T &l,const T &r){return l>r?l=r,1:0;}
const ll MOD=1e9+7;

int d[112][112];

int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
  int n,m;
  cin>>n>>m;
  vv<int> g(n);
  if(m>3*n){
    rep(i,n){
      cout<<"lst "<<i<<endl;
      int t;
      cin>>t;
      vector<int> a(t,-1);
      rep(j,t){
	int x;
	cin>>x;
	if(x>=0) a[j]=x;
      }
      int f=0;
      rep(j,t) if(a[j]<0) f=1;
      while(f){
	cout<<"lst "<<i<<endl;
	cin>>f;
	f=0;
	rep(j,t){
	  int x;
	  cin>>x;
	  if(x>=0) a[j]=x;
	}
	rep(j,t) if(a[j]<0) f=1;
      }
      g[i]=a;
    }
  }else{
    rep(i,m){
      cout<<"edg "<<i<<endl;
      int x,y;
      cin>>x>>y;
      g[x].pb(y);
      g[y].pb(x);
    }
  }
  //cout<<g;
  ll re=0;
  rep(i,n) for(int v:g[i]) re+=g[v].size()-1;
  cout<<"ans "<<re<<endl;
  return 0;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3104
final_rank: 12

code_snippet: #include<bits/stdc++.h>
using namespace std;
#define MAX_V 110
int INF = 1 << 28;
struct edge{int to,cap,rev;};
vector<edge> G[MAX_V*2+2];
bool used[MAX_V*2+2];
void add_edge(int from,int to,int cap){
  G[from].push_back((edge){to,cap,G[to].size()});
  G[to].push_back((edge){from,0,G[from].size()-1});
}

int dfs(int v,int t,int f){
  if(v==t) return f;
  used[v]=true;
  for(int i=0;i<G[v].size();i++){
    edge &e = G[v][i];
    if(!used[e.to] && e.cap > 0 ){
      int d=dfs(e.to,t,min(f,e.cap));
      if(d>0){
	e.cap-=d;
	G[e.to][e.rev].cap+=d;
	return d;
      }
    } 
  }
  return 0;
}

int max_flow(int s,int t){
  int flow=0;
  for(;;){
    memset(used,0,sizeof(used));
    int f=dfs(s,t,INF);
    if(f==0) return flow;
    flow+=f;
  }
}

int x[MAX_V][MAX_V];
int ans=0;

void dfs2(int c,int v,int d){
  if(d==2){ 
    if(c!=v) ans++;
  }else{
    for(int i=0;i<MAX_V;i++){
      if(x[v][i]) dfs2(c,i,d+1);
    }
  }
}

int main(){
  int n,m,i,j,k,c=0,d=0;
  cin>>n>>m;
  int s=0,t=2*n+1;
  for(i=0;i<n;i++){
    cout << "lst " << i << endl;
    cin >> k;
    add_edge(s,i+1,k);
    add_edge(n+i+1,t,k);
    for(j=0;j<k;j++) cin >> c;
  }
  for(i=1;i<=n;i++){
    for(j=n+1;j<=n*2;j++){
      if(j-i==n) continue;
      add_edge(i,j,1);
    } 
  }
  int e=max_flow(s,t);
  
  memset(x,0,sizeof(x));
  for(i=0;i<n;i++){
    for(j=0;j<G[i+1].size();j++){
      if(G[i+1][j].cap==0) x[G[i+1][j].to-n-1][i]=1;
    }
  }
  for(i=0;i<n;i++) dfs2(i,i,0);
  cout << "ans "<< ans << endl;
  return 0;
}
accuracy: 0.024390243902439025
time_ms: 20
memory_kb: 1592
final_rank: 7

code_snippet: #include <bits/stdc++.h>
using namespace std;

int main(){
  int n,m;
  cin>>n>>m;
  
  int ans=0;

  for(int i=0;i<n;i++){
    cout <<"lst "<<i<<endl;
    int a,b;
    cin>>a;
    for(int i=0;i<a;i++) cin>>b;
    ans+=a*(a-1);
  }
  cout <<"ans "<<ans<<endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1272
final_rank: 1

code_snippet: #include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef int _loop_int;
#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)

#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl
#define ALL(a) (a).begin(),(a).end()

#define CHMIN(a,b) a=min((a),(b))
#define CHMAX(a,b) a=max((a),(b))

// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a)%MOD+MOD)%MOD

// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x)<EPS)
#define EQ(a,b) (abs(a-b)<EPS)
typedef complex<Real> P;

int deg[125];
int unko[125];
int g[125][125];

int main(){
  int n,m;
  cin>>n>>m;
  int cnt = 0;
  // first check
  REP(i,n){
    ++cnt;
    cout<<"lst "<<i<<endl;
    int k;
    cin>>k;
    deg[i] = k;
    unko[i] += k;
    REP(j,k){
      int to;
      cin>>to;
      if(to!=-1){
        if(g[i][to]==0){
          g[i][to] = 1;
          unko[i] -= 1;
        }
        if(g[to][i]==0){
          g[to][i] = 1;
          unko[to] -= 1;
        }
      }
    }
  }
  while(cnt < 3*n){
    int mx = 0;
    REP(i,n)if(unko[mx]<unko[i])mx=i;
    if(unko[mx]==0)break;
    ++cnt;
    cout<<"lst "<<mx<<endl;
    int k;
    cin>>k;
    REP(j,k){
      int to;
      cin>>to;
      if(to!=-1){
        if(g[mx][to]==0){
          g[mx][to] = 1;
          unko[mx] -= 1;
        }
        if(g[to][mx]==0){
          g[to][mx] = 1;
          unko[to] -= 1;
        }
      }
    }
  }
  int ans = 0;
  REP(i,n){
    REP(j,n)if(g[i][j])ans += deg[j]-1;
  }
  cout<<"ans "<<ans<<endl;
  return 0;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 1280
final_rank: 5

code_snippet: #include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef int _loop_int;
#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)

#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl
#define ALL(a) (a).begin(),(a).end()

#define CHMIN(a,b) a=min((a),(b))
#define CHMAX(a,b) a=max((a),(b))

// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a)%MOD+MOD)%MOD

// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x)<EPS)
#define EQ(a,b) (abs(a-b)<EPS)
typedef complex<Real> P;

int deg[125];
int known[125];
vi unko;
int g[125][125];

int main(){
  int n,m;
  cin>>n>>m;
  REP(i,n)unko.push_back(i);
  bool first = true;
  while(true){
    // query
    REP(i,unko.size()){
      int x = unko[i];
      if(!first && known[x]==0)continue;
      cout<<"lst "<<x<<endl;
      int k;
      cin>>k;
      if(first){
        deg[x] = k;
        known[x] += k;
      }
      REP(j,k){
        int to;
        cin>>to;
        if(to>=0){
          if(g[x][to]==0){
            g[x][to] = 1;
            known[x] -= 1;
          }
          if(g[to][x]==0){
            g[to][x] = 1;
            known[to] -= 1;
          }
        }
      }
    }
    first = false;
    bool flag = true;
    vi nxt;
    REP(i,unko.size()){
      int x = unko[i];
      if(known[x]>0){
        nxt.push_back(x);
        flag = false;
      }
    }
    if(flag)break;
    unko = nxt;
  }
  int ans = 0;
  REP(i,n){
    REP(j,n)if(g[i][j])ans += deg[j]-1;
  }
  cout<<"ans "<<ans<<endl;
  return 0;
}
accuracy: 0.024390243902439025
time_ms: 30
memory_kb: 1280
final_rank: 6

code_snippet: #include <bits/stdc++.h>

using namespace std;

int main()
{
  int N, M;
  int sz[100] = {};
  set< int > graph[100];
  set< pair< int, int > > sa;

  cin >> N >> M;

  if(N * 3 >= M) {
    for(int i = 0; i < M; i++) {
      cout << "edg " << i << endl;
      int a, b;
      cin >> a >> b;
      graph[a].insert(b);
      graph[b].insert(a);
    }
  } else {

    for(int i = 0; i < N; i++) {
      int k;
      cout << "lst " << i << endl;
      cin >> k;
      sz[i] = k;
      for(int j = 0; j < k; j++) {
        int v;
        cin >> v;
        if(~v) {
          graph[v].insert(i);
          graph[i].insert(v);
        }
      }
    }

    for(int i = 0; i < N; i++) {
      sa.emplace(sz[i] - graph[i].size(), i);
    }

    for(int _ = 0; _ * 2 < N; _++) {
      auto obj = *--sa.end();
      int i = obj.second;
      sa.erase(obj);
      if(graph[i].size() != sz[i]) {
        cout << "lst " << i << endl;
        int k;
        cin >> k;
        sz[i] = k;
        for(int j = 0; j < k; j++) {
          int v;
          cin >> v;
          if(~v) {
            graph[v].insert(i);
            graph[i].insert(v);
          }
        }
      }
      sa.emplace(sz[i] - graph[i].size(), i);
    }
  }

  int ret = 0;
  for(int i = 0; i < N; i++) {
    for(auto j : graph[i]) {
      set< int > gg;
      for(auto k : graph[j]) {
        if(i != k) gg.insert(k);
      }
      ret += gg.size();
    }
  }

  cout << "ans " << ret << endl;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3276
final_rank: 16

code_snippet: #include <bits/stdc++.h>

using namespace std;

int main()
{
  int N, M;
  int sz[100] = {};
  set< int > graph[100];
  set< pair< int, int > > sa;

  cin >> N >> M;

  for(int i = 0; i < N; i++) {
    int k;
    cout << "lst " << i << endl;
    cin >> k;
    sz[i] = k;
    for(int j = 0; j < k; j++) {
      int v;
      cin >> v;
      if(~v) {
        graph[v].insert(i);
        graph[i].insert(v);
      }
    }
  }

  for(int i = 0; i < N; i++) {
    sa.emplace(sz[i] - graph[i].size(), i);
  }

  for(int _ = 0; _ * 2 < N; _++) {
    auto obj = *--sa.end();
    int i = obj.second;
    sa.erase(obj);
    if(graph[i].size() != sz[i]) {
      cout << "lst " << i << endl;
      int k;
      cin >> k;
      sz[i] = k;
      for(int j = 0; j < k; j++) {
        int v;
        cin >> v;
        if(~v) {
          graph[v].insert(i);
          graph[i].insert(v);
        }
      }
    }
    sa.emplace(sz[i] - graph[i].size(), i);
  }

  int ret = 0;
  for(int i = 0; i < N; i++) {
    for(auto j : graph[i]) {
      set< int > gg;
      for(auto k : graph[j]) {
        if(i != k) gg.insert(k);
      }
      ret += gg.size();
    }
  }

  cout << "ans " << ret << endl;
}
accuracy: 0.024390243902439025
time_ms: 10
memory_kb: 3272
final_rank: 15

code_snippet: #include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
#define rrep(i,n) for(int i=(n)-1; i>=0; i--)

using namespace std;
typedef long long ll;

int main(){
	int N, M, c;
	ll a[105], ans=0;
	
	cin >> N >> M;

	rep(i,N){
		cout << "lst " << i << endl;
		cin >> a[i];
		rep(j,a[i]) cin >> c;
		ans += a[i] * (a[i]-1);
	}

	cout << "ans " << ans << endl;

	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3108
final_rank: 4