func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 3005;   const int maxm = maxn * maxn << 1;   int n, m, q;   int id[maxn][maxn << 1];   int fa[maxm];   int vis[maxm];   int top = 0;   stack<pair<int, int> > sta;   inline int getfa(int x) {     sta.push(make_pair(x, fa[x]));     return fa[x] == x ? x : fa[x] = getfa(fa[x]);   }   inline void bing(int x, int y) {     if (vis[x] && vis[y]) {       int fax = getfa(x);       int fay = getfa(y);       if (fax != fay) fa[fax] = fay;     }   }   inline void Union(int x, int y) {     int now = id[x][y];     bing(id[x + 1][y], now);     bing(id[x + 1][y - 1], now);     bing(id[x + 1][y + 1], now);     bing(id[x - 1][y], now);     bing(id[x - 1][y - 1], now);     bing(id[x - 1][y + 1], now);     bing(id[x][y - 1], now);     bing(id[x][y + 1], now);   }   inline void rm() {     while (!sta.empty()) {       fa[sta.top().first] = sta.top().second;       sta.pop();     }   }   int main() {     scanf( %d%d%d , &n, &m, &q);     int __cnt = 0;     for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= (m << 1); ++j) {         id[i][j] = ++__cnt;         fa[id[i][j]] = id[i][j];       }     }     for (int i = 1; i <= n; ++i) {       id[i][0] = id[i][m << 1];       id[i][m << 1 | 1] = id[i][1];     }     int ans = 0;     while (q--) {       int x, y;       scanf( %d%d , &x, &y);       if (vis[id[x][y]]) continue;       vis[id[x][y]] = vis[id[x][y + m]] = true;       Union(x, y);       Union(x, y + m);       if (getfa(id[x][y]) == getfa(id[x][y + m])) {         rm();         vis[id[x][y]] = vis[id[x][y + m]] = false;       } else         ans++;       while (!sta.empty()) sta.pop();     }     printf( %d n , ans);     return 0;   }   