Problem:
Problem I: Hopping Mind
Problem
チエノとカカオは同じ喫茶店で働く姉妹である。2人はとても仲が良く、ある日、とあるテーブルゲームで遊ぶことになった。
ゲームは
R
マス×
C
マスの盤面と、駒としてうさぎのTPを用いる。盤面の各マスは白か黒の色が塗られている。最初にTPを盤面の右下(
R
,
C
)におき、2人で次の行動を交互に行う。TPの現在の位置を(
a
,
b
)とすると、そこからジャンプ可能な位置(
i
,
j
)を1つ選び、TPをそこにジャンプさせる。TPがジャンプ可能な位置(
i
,
j
)は以下をすべて満たす。
1 ≤
i
≤
R
かつ 1 ≤
j
≤
C
かつ
i
≤
a
かつ
j
≤
b
かつ 1 ≤ (
a
-
i
) + (
b
-
j
) ≤
K
(
i
,
j
)は白いマスである
自分のターンにTPをジャンプさせることができなくなった場合、負けとなる。
チエノが先手、カカオが後手でこのゲームを行う。カカオは頭の中でゲームを最後まで先読みすることができ、常に最適な行動をとる。この時、チエノが勝つ方法が存在するかどうかを判定せよ。
Input
入力は以下の形式で与えられる。
R
C
K
G
1,1
G
1,2
...
G
1,C
G
2,1
G
2,2
...
G
2,C
:
G
R,1
G
R,2
...
G
R,C
1行目に3つの整数
R
,
C
,
K
が空白区切りで与えられる。次の
R
行に盤面の情報として
C
個の".”または"#”が与えられる。
G
i,j
は盤面の位置(
i
,
j
)の色を表し、”.”が白、"#”が黒を表す。
Constraints
1 ≤
R
,
C
≤ 1000
1 ≤
K
≤ 2000
G
R,C
は“.”である
Output
チエノが勝つ方法が存在する場合は”Chieno”を、存在しない場合は”Cacao”を1行に出力せよ。
Sample Input1
3 3 2
...
...
...
Sample Output1
Chieno
Sample Input2
3 3 2
#.#
.#.
#..
Sample Output2
Cacao

Submitted solutions:

code_snippet: #include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define HUGE_NUM 99999999999999999
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


#define SIZE 1005

int H,W,K;
int table[SIZE][SIZE];
char base_map[SIZE][SIZE];


int main(){

	scanf("%d %d %d",&H,&W,&K);

	for(int row = 0; row < H; row++){

		scanf("%s",base_map[row]);
	}

	table[0][0] = -1;
	int North,West;

	for(int row = 0; row < H; row++){
		for(int col = 0; col < W; col++){
			if(row == 0 && col == 0)continue;

			North = -1,West = -1;

			if(row > 0){
				if(base_map[row-1][col] == '.' && table[row-1][col] <= 0){

					North = K;
				}else{

					North = table[row-1][col]-1;
				}
			}
			if(col > 0){
				if(base_map[row][col-1] == '.' && table[row][col-1] <= 0){

					West = K;

				}else{

					West = table[row][col-1]-1;
				}

			}
			table[row][col] = max(North,West);
		}
	}

	if(table[H-1][W-1] > 0){

		printf("Chieno\n");

	}else{

		printf("Cacao\n");
	}

	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 8388
final_rank: 3

code_snippet: // AOJ #1559 Hopping Mind
// 2025.2.20

#include <bits/stdc++.h>
using namespace std;
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    int R, C, K;
    cin >> R >> C >> K;
    vector<string> board(R);
    for (int i = 0; i < R; i++) cin >> board[i];
 
    vector<vector<bool>> dp(R+1, vector<bool>(C+1, false));
 
    int sMax = R + C;
    vector<vector<int>> lose(sMax+1);
 
    for (int s = 2; s <= sMax; s++){
        int iLow = max(1, s - C);
        int iHigh = min(R, s - 1);
        for (int i = iLow; i <= iHigh; i++){
            int j = s - i;
            if(board[i-1][j-1] == '#') continue;
 
            bool win = false;
            int dLow = max(2, s - K);
            int dHigh = s - 1;
            for (int d = dLow; d <= dHigh; d++){
                int lowerRow = max(1, d - j);
                if(lowerRow > i) continue;
                auto it = std::lower_bound(lose[d].begin(), lose[d].end(), lowerRow);
                if(it != lose[d].end() && *it <= i){
                    win = true;
                    break;
                }
            }
            dp[i][j] = win;
            if(!win) lose[s].push_back(i);
        }
    }
    cout << ( dp[R][C] ? "Chieno" : "Cacao" ) << endl;
    return 0;
}
accuracy: 1
time_ms: 200
memory_kb: 6576
final_rank: 8

code_snippet: #include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define all(x) (x).begin(),(x).end()
#define pb push_back
#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;}

struct BIT{
    // [1,n]
    int n; vector<ll> bit;
    // 初期化
    BIT(){}
    BIT(int _n){
        n = _n;
        bit = vector<ll>(n+1,0);
    }
    // sum of [1,i]
    ll sum(int i){
        ll s = 0;
        while(i>0){
            s += bit[i];
            i -= i & -i;
        }
        return s;
    }
    // add x in i-th element
    void add(int i, ll x){
        while(i<=n){
            bit[i] += x;
            i += i & -i;
        }
    }
    // [l,r]
    ll sum(int l, int r){
        return sum(r)-sum(l-1);
    }
};

const int M = 2020;
const int N = 3333;

BIT row[N],col[N];

int main(){
    int h,w,k;
    cin >>h >>w >>k;

    vector<string> s(h);
    rep(i,h) cin >>s[i];

    vector<vector<pair<int,int>>> v(h+w-1);
    rep(i,h)rep(j,w) v[i+j].pb({i, j});

    rep(i,N){
        row[i] = BIT(N);
        col[i] = BIT(N);
    }

    auto calc = [&](int y, int x, ll val){
        y -= M;
        x -= M;
        if(s[y][x] == '#') return 0;
        return (int)!val;
    };

    ll sum = 0;
    int pi = M, pj = M;
    vector<vector<int>> dp(N,vector<int>(N));
    rep(i,h+w-1){
        sort(all(v[i]));
        int V = v[i].size();

        int si = v[i][0].fi+M, sj = v[i][0].se+M;
        if(i>0){
            int ti = pi-k, tj = pj;
            while(ti<=pi){
                sum -= dp[ti][tj];
                ++ti;
                --tj;
            }
            sum += dp[pi][pj];

            if(pi == si) sum += col[sj].sum(si-k,si-1);
            else sum += row[si].sum(sj-k,sj-1);
        }

        dp[si][sj] = calc(si, sj, sum);
        ll tsum = sum;
        for(int j=1; j<V; ++j){
            int ti = v[i][j].fi+M, tj = v[i][j].se+M;
            tsum -= col[tj+1].sum(ti-k-1, ti-1-1);
            tsum += row[ti].sum(tj-k, tj-1);
            dp[ti][tj] = calc(ti, tj, tsum);
        }

        rep(j,V){
            int ti = v[i][j].fi+M, tj = v[i][j].se+M;
            row[ti].add(tj, dp[ti][tj]);
            col[tj].add(ti, dp[ti][tj]);
        }

        pi = si;
        pj = sj;
    }

    cout << (dp[M+h-1][M+w-1]?"Cacao":"Chieno") << endl;
    return 0;
}
accuracy: 1
time_ms: 260
memory_kb: 231996
final_rank: 9

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

typedef pair<int,int> P;
typedef long long ll;

#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);(i)++)
#define rep(i,n) repl(i,0,n)
#define dbg(x) cout<<#x<<"="<<x<<endl

#define INF INT_MAX/3

int H,W,K;
char S[1001][1001];
int d[1001][1001];

int main(){
  scanf("%d%d%d",&H,&W,&K);
  rep(i,H){
    scanf("%s",S[i]);
  }

  rep(i,H)rep(j,W){
    if(i==0&&j==0){
      d[i][j]=-1;
      continue;
    }

    int a=-INF,b=-INF;
    if(i>0){
      if(S[i-1][j]=='.'&&d[i-1][j]<=0)a=K; 
      else a=d[i-1][j]-1;
    }
    if(j>0){
      if(S[i][j-1]=='.'&&d[i][j-1]<=0)b=K; 
      else b=d[i][j-1]-1;
    }

    d[i][j]=max(a,b);
  }

  if(d[H-1][W-1]<=0)cout<<"Cacao"<<endl;
  else cout<<"Chieno"<<endl;

  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 8064
final_rank: 2

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

typedef pair<int,int> P;
typedef long long ll;

#define repl(i,a,b) for(int i=(int)(a);i<(int)(b);(i)++)
#define rep(i,n) repl(i,0,n)
#define dbg(x) cout<<#x<<"="<<x<<endl

#define INF INT_MAX/3

int H,W,K;
char S[1001][1001];
int d[1001][1001];

int main(){
  scanf("%d%d%d",&H,&W,&K);
  rep(i,H){
    scanf("%s",S[i]);
  }

  rep(i,H)rep(j,W){
    if(i==0&&j==0){
      d[i][j]=-1;
      continue;
    }

    int a=INF,b=INF;
    if(i>0){
      if(S[i-1][j]=='.'&&d[i-1][j]<=0)a=K; 
      else a=d[i-1][j]-1;
    }
    if(j>0){
      if(S[i][j-1]=='.'&&d[i][j-1]<=0)b=K; 
      else b=d[i][j-1]-1;
    }

    d[i][j]=min(a,b);
  }

  if(d[H-1][W-1]<=0)cout<<"Cacao"<<endl;
  else cout<<"Chieno"<<endl;

  return 0;
}
accuracy: 0.34375
time_ms: 10
memory_kb: 8092
final_rank: 11

code_snippet: #include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
typedef pair<int,P> PP;

int r,c,k;
int fie[1005][1005];
PP p[1000005];
int dp[1005][1005];
int maxi[1005][1005];

int main(void){
	scanf("%d%d%d",&r,&c,&k);
	for(int i=0;i<r;i++){
		string s;
		cin >> s;
		for(int j=0;j<c;j++){
			if(s[j]=='#'){
				fie[i][j]=1;
			}
			p[i*c+j]=PP(i+j,P(i,j));
		}
	}
	sort(p,p+r*c);
	queue<P> que;
	for(int i=0;i<r*c;i++){
		que.push(p[i].second);
	}
	memset(maxi,-1,sizeof(maxi));
	while(que.size()){
		P p=que.front();
		que.pop();
		int x=p.second,y=p.first;
		if(x>0){
			maxi[y][x]=max(maxi[y][x],maxi[y][x-1]);
		}
		if(y>0){
			maxi[y][x]=max(maxi[y][x],maxi[y-1][x]-1);
		}
		if(fie[y][x]==1)continue;
		if(x<=maxi[y][x]){
			dp[y][x]=1;
		}else{
			dp[y][x]=0;
			maxi[y][x]=x+k;
		}
	}
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++){
			//printf("%d ",dp[i][j]);
		}
		//printf("\n");
	}
	printf("%s\n",dp[r-1][c-1]==1?"Chieno":"Cacao");
	return 0;
}
accuracy: 1
time_ms: 110
memory_kb: 34536
final_rank: 7

code_snippet: #include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
typedef pair<int,P> PP;

int r,c,k;
int fie[1005][1005];
PP p[1000005];
int dp[1005][1005];
int maxi[1005][1005];

int main(void){
	scanf("%d%d%d",&r,&c,&k);
	for(int i=0;i<r;i++){
		string s;
		cin >> s;
		for(int j=0;j<c;j++){
			if(s[j]=='#'){
				fie[i][j]=1;
			}
			p[i*r+j]=PP(i+j,P(i,j));
		}
	}
	sort(p,p+r*c);
	queue<P> que;
	for(int i=0;i<r*c;i++){
		que.push(p[i].second);
	}
	memset(maxi,-1,sizeof(maxi));
	while(que.size()){
		P p=que.front();
		que.pop();
		int x=p.second,y=p.first;
		if(x>0){
			maxi[y][x]=max(maxi[y][x],maxi[y][x-1]);
		}
		if(y>0){
			maxi[y][x]=max(maxi[y][x],maxi[y-1][x]-1);
		}
		if(fie[y][x]==1)continue;
		if(x<=maxi[y][x]){
			dp[y][x]=1;
		}else{
			dp[y][x]=0;
			maxi[y][x]=x+k;
		}
	}
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++){
			//printf("%d ",dp[i][j]);
		}
		//printf("\n");
	}
	printf("%s\n",dp[r-1][c-1]==1?"Chieno":"Cacao");
	return 0;
}
accuracy: 0.375
time_ms: 110
memory_kb: 34672
final_rank: 10

code_snippet: #include <cstdio>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <limits>
#include <climits>
#include <cfloat>
#include <functional>
using namespace std;

int main()
{
    int r, c, k;
    cin >> r >> c >> k;
    vector<string> g(r, string(c, '#'));
    for(int y=0; y<r; ++y){
        for(int x=0; x<c; ++x){
            cin >> g[y][x];
        }
    }

    ++ k;
    vector<vector<bool> > dp(r, vector<bool>(c, false));
    vector<int> add(c);
    deque<int> sub(r+c);
    for(int y=0; y<r; ++y){
        int sum = 0;
        for(int x=0; x<c; ++x){
            if(0 <= y - k && g[y-k][x] == '.' && !dp[y-k][x]){
                -- add[x];
                -- sub[y+x-k];
            }

            sum += add[x];
            if(0 <= y + x - k)
                sum -= sub[y+x-k];

            if(g[y][x] == '.'){
                if(sum > 0){
                    dp[y][x] = true;
                }
                else{
                    ++ add[x];
                    ++ sub[y+x];
                    ++ sum;
                }
            }
        }
    }

    if(dp[r-1][c-1])
        cout << "Chieno" << endl;
    else
        cout << "Cacao" << endl;

    return 0;
}
accuracy: 1
time_ms: 60
memory_kb: 2408
final_rank: 6

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>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(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()

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<<")";}

int sum[1123][1123],sumd[1123][1123],lose[1123][1123],n,m,t;

int Sum(int y,int x){
  int re=sum[y][x];
  //cout<<pii(x,y)<<endl;
  if(x-t-2>=0)
    re+=sumd[y+1][x-t-2];
  //cout<<re<<",";
  if(y-t>=0){
    if(y-t)re-=sum[y-t-1][x];
    if(x)re-=sumd[y-t][x-1];
  }else{
    if(x-t+y)re-=sumd[0][x-t+y-1];
  }
  //cout<<re<<endl;
  return re;
}

int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
  int i,j,k;
  cin>>n>>m>>t;
  vector<string> mp(n);
  rep(i,n)
    cin>>mp[i];
  rep(j,m)rep(i,n){
    if(Sum(i,j)==0&&mp[i][j]=='.'){
      lose[i][j]=1;
      ++sum[i][j];
      ++sumd[i][j];
    }
    sumd[i][j+1]+=sumd[i][j];
    if(i){
      sumd[i-1][j+1]+=sumd[i][j];
      sumd[i-1][j+2]-=sumd[i][j];
    }
    sum[i+1][j]+=sum[i][j];
    sum[i][j+1]+=sum[i][j];
    sum[i+1][j+1]-=sum[i][j];
  }
  //rep(i,n){rep(j,m)cout<<lose[i][j];cout<<endl;}
  //rep(i,n){rep(j,m)cout<<sum[i][j]<<",";cout<<endl;}
  //rep(i,n){rep(j,m)cout<<sumd[i][j]<<",";cout<<endl;}
  cout<<(lose[n-1][m-1]?"Cacao":"Chieno")<<endl;
  return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 16428
final_rank: 4

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>
#define X first
#define Y second
#define pb push_back
#define rep(X,Y) for (int (X) = 0;(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()

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<<")";}

int sum[1123][1123],sumd[1123][1123],lose[1123][1123],n,m,t;

int Sum(int y,int x){
  int re=sum[y][x];
  //cout<<pii(x,y)<<endl;
  if(x-t-2>=0)
    re+=sumd[y+1][x-2];
  //cout<<re<<",";
  if(y-t>=0){
    if(y-t)re-=sum[y-t-1][x];
    if(x)re-=sumd[y-t][x-1];
  }else{
    if(x-t+y)re-=sumd[0][x-t+y-1];
  }
  //cout<<re<<endl;
  return re;
}

int main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
  int i,j,k;
  cin>>n>>m>>t;
  vector<string> mp(n);
  rep(i,n)
    cin>>mp[i];
  rep(j,m)rep(i,n){
    if(Sum(i,j)==0&&mp[i][j]=='.'){
      lose[i][j]=1;
      ++sum[i][j];
      ++sumd[i][j];
    }
    sumd[i][j+1]+=sumd[i][j];
    if(i){
      sumd[i-1][j+1]+=sumd[i][j];
      sumd[i-1][j+2]-=sumd[i][j];
    }
    sum[i+1][j]+=sum[i][j];
    sum[i][j+1]+=sum[i][j];
    sum[i+1][j+1]-=sum[i][j];
  }
  //rep(i,n){rep(j,m)cout<<lose[i][j];cout<<endl;}
  //rep(i,n){rep(j,m)cout<<sum[i][j]<<",";cout<<endl;}
  //rep(i,n){rep(j,m)cout<<sumd[i][j]<<",";cout<<endl;}
  cout<<(lose[n-1][m-1]?"Cacao":"Chieno")<<endl;
  return 0;
}
accuracy: 0.28125
time_ms: 20
memory_kb: 16428
final_rank: 12

code_snippet: #include<stdio.h>
#include<algorithm>
using namespace std;
#define SZ 1024
char p[1010][1010];
int n, m, K, IT[SZ + SZ + 1];
int Max(int b, int e){
	int r = -9999999;
	b += SZ, e += SZ;
	while (b <= e){
		r = max(r, IT[b]);
		r = max(r, IT[e]);
		b = (b + 1) >> 1;
		e = (e - 1) >> 1;
	}
	return r;
}
void Add(int a, int b){
	a += SZ;
	while (a){
		IT[a] = max(IT[a], b);
		a >>= 1;
	}
}
int main(){
	int i, j, ck;
	scanf("%d%d%d", &n, &m, &K);
	for (i = 1; i <= n; i++){
		scanf("%s", p[i] + 1);
	}
	for (i = 1; i < SZ * 2; i++)IT[i] = -9999999;
	for (i = 1; i <= n; i++){
		for (j = 1; j <= m; j++){
			ck = 0;
			if (p[i][j] != '.')continue;
			if (i + j - Max(1, j) > K){
				ck = 1;
				Add(j, i + j);
			}
		}
	}
	if (ck == 0)printf("Chieno\n");
	else printf("Cacao\n");
}
accuracy: 1
time_ms: 10
memory_kb: 2008
final_rank: 1

code_snippet: #include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,b) FOR(i,0,b)
#define F first
#define S second
#define X real()
#define Y imag()
#define PB push_back 
#define BE(c) c.begin(),c.end()
using namespace std;
typedef long long LL;
typedef complex<int> cld;
typedef LL ut;
typedef vector<ut> VI;
typedef pair<ut,ut> pr;
typedef vector<pr> Vpr;
typedef vector<ut,pr> ppr;
typedef pair<string,ut> ps;
typedef priority_queue<pr,Vpr,greater<pr> > PQ;
const int SIZE=1001;
const int INF=1<<30;
int dist[SIZE];
Vpr edge;
int isWin[SIZE][SIZE];
int main(){
	int R,C,K;
	char c;
	cin >>R >> C >> K;
	REP(i,R)
		REP(j,C){
			scanf(" %c",&c);
			if(c=='#')
				isWin[i][j]=1;
		}
	REP(i,R)
		REP(j,C){
			if(isWin[i][j]){
				isWin[i+1][j]=max(isWin[i+1][j],isWin[i][j]-1);
				isWin[i][j+1]=max(isWin[i][j+1],isWin[i][j]-1);
			}
			else{
				isWin[i+1][j]=max(isWin[i+1][j],K);
				isWin[i][j+1]=max(isWin[i][j+1],K);
			}
		}
	if(isWin[R-1][C-1])
		cout <<"Chieno" << endl;
	else
		cout <<"Cacao" << endl;
}
accuracy: 1
time_ms: 40
memory_kb: 5100
final_rank: 5