func_code_string: #include <bits/stdc++.h>   int st, h, t, r, n, m, tot;   int f[200 + 10][200 + 10] = {0}, g[200 + 10][200 + 10] = {0};   int a[200 + 10][2] = {0}, b[200 + 10][2] = {0};   bool hash[200 + 10][200 + 10] = {0};   int td = 0, top = 0, sum = 0;   int totm[2] = {0}, e[2][10000000 + 10] = {0}, last[2][10000000 + 10] = {0},       now[2][40401 + 10] = {0};   int stack[40401 + 10] = {0}, low[40401 + 10] = {0}, dfn[40401 + 10] = {0};   int fa[40401 + 10] = {0};   bool ok[40401 + 10] = {0}, used[40401 + 10] = {0};   int dl[40401 + 10] = {0}, step[40401 + 10] = {0};   inline void set(bool t, int u, int v) {     ++totm[t];     e[t][totm[t]] = v;     last[t][totm[t]] = now[t][u];     now[t][u] = totm[t];   }   inline void build() {     int i, j, k, p, q;     tot = (r + 1) * (r + 1);     for (i = 0; i <= r; ++i)       for (j = 0; i + j <= r; ++j) {         for (k = 1; k <= n && k <= i; ++k) {           p = i - k + a[k][0], q = j + a[k][1];           if (p + q <= r) set(0, i * (r + 1) + j + 1, p * (r + 1) + q + 1);         }         for (k = 1; k <= m && k <= j; ++k) {           p = i + b[k][0], q = j - k + b[k][1];           if (p + q <= r) set(0, i * (r + 1) + j + 1, p * (r + 1) + q + 1);         }       }   }   inline void bfs() {     int l = 0, r = 1;     int i, j;     dl[0] = st;     step[st] = 1;     while (l < r) {       i = dl[l];       for (j = now[0][i]; j; j = last[0][j])         if (!step[e[0][j]]) {           step[e[0][j]] = step[i] + 1;           dl[r++] = e[0][j];         }       ++l;     }   }   void tarjan(int i) {     int j;     stack[++top] = i;     dfn[i] = ++td;     low[i] = td;     for (j = now[0][i]; j; j = last[0][j]) {       if (!dfn[e[0][j]]) {         tarjan(e[0][j]);         low[i] = ((low[i]) < (low[e[0][j]]) ? (low[i]) : (low[e[0][j]]));       } else if (!fa[e[0][j]])         low[i] = ((low[i]) < (dfn[e[0][j]]) ? (low[i]) : (dfn[e[0][j]]));     }     if (low[i] == dfn[i]) {       ++sum;       do fa[stack[top]] = sum;       while (stack[top--] != i);     }   }   bool dfs3(int i) {     if (ok[i]) return (1);     if (used[i]) return (0);     used[i] = 1;     int j;     for (j = now[1][i]; j; j = last[1][j])       if (dfs3(e[1][j])) return (1);     return (0);   }   inline bool draw() {     int i, j;     for (i = 1; i <= tot; ++i)       if (!dfn[i]) tarjan(i);     for (i = 1; i <= tot; ++i)       for (j = now[0][i]; j; j = last[0][j]) {         if (fa[i] != fa[e[0][j]])           set(1, fa[i], fa[e[0][j]]);         else           ok[fa[i]] = 1;       }     return (dfs3(fa[h * (r + 1) + t + 1]));   }   int dfs2(int i, int j) {     if (i + j > r) return (0);     if (hash[i][j]) return (g[i][j]);     hash[i][j] = 1;     int k;     for (k = 1; k <= n && k <= i; ++k)       g[i][j] = ((g[i][j]) > (dfs2(i - k + a[k][0], j + a[k][1]) + 1)                      ? (g[i][j])                      : (dfs2(i - k + a[k][0], j + a[k][1]) + 1));     for (k = 1; k <= m && k <= j; ++k)       g[i][j] = ((g[i][j]) > (dfs2(i + b[k][0], j - k + b[k][1]) + 1)                      ? (g[i][j])                      : (dfs2(i + b[k][0], j - k + b[k][1]) + 1));     return (g[i][j]);   }   int main() {     int i, j;     scanf( %d%d%d , &h, &t, &r);     st = h * (r + 1) + t + 1;     scanf( %d , &n);     for (i = 1; i <= n; ++i) scanf( %d%d , &a[i][0], &a[i][1]);     scanf( %d , &m);     for (i = 1; i <= m; ++i) scanf( %d%d , &b[i][0], &b[i][1]);     build();     bfs();     if (step[1])       printf( Ivan n%d n , step[1] - 1);     else if (draw())       printf( Draw n );     else {       memset(hash, 0, sizeof(hash));       printf( Zmey n%d n , dfs2(h, t));     }     return (0);   }   