Problem: Problem

Chieno and Cacao are sisters who work in the same coffee shop. The two are very close, and one day they decided to play a table game.

The game uses the board of R square x C square and the rabbit TP as a piece. Each square on the board is painted white or black. First, place the TP in the lower right corner (R, C) of the board, and the two perform the following actions alternately. Assuming that the current position of TP is (a, b), one jumpable position (i, j) is selected from there, and TP is made to jump there. The positions (i, j) where TP can jump satisfy all of the following.

1. 1 ≤ i ≤ R and 1 ≤ j ≤ C and i ≤ a and j ≤ b and 1 ≤ (a-i) + (b-j) ≤ K
2. (i, j) is a white square



If you can no longer jump TP on your turn, you lose.

Chieno is on the play and Cacao is on the play. Cacao can look ahead to the end of the game in his head and always behaves optimally. At this time, determine if there is a way for Chieno to win.

Constraints

* 1 ≤ R, C ≤ 1000
* 1 ≤ K ≤ 2000
* GR and C are “.”

Input

The input is given in the following format.


R C K
G1,1 G1,2 ... G1,C
G2,1 G2,2 ... G2, C
::
GR, 1 GR, 2 ... GR, C


The first line is given three integers R, C, K separated by blanks. C "." Or "#" are given as board information in the next R line. Gi, j represents the color of the board position (i, j), "." Represents white, and "#" represents black.

Output

Print "Chieno" if there is a way for Chieno to win, or "Cacao" if it doesn't.

Examples

Input

3 3 2
...
...
...


Output

Chieno


Input

3 3 2
.#
.#.
..


Output

Cacao

Solution (in CPP):

Solution:
#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;
}