func_code_string: #include <bits/stdc++.h>   using namespace std;   set<pair<int, int> > z[200010], f[200010];   map<int, int> use[200010];   int n, m, k, dir;   int sx, sy;   inline void insert(int x, int y) {     z[x - y + m + 1].insert(make_pair(x, y));     f[x + y].insert(make_pair(x, y));     use[x][y] = 1;   }   void init() {     char s[3];     scanf( %d%d%d , &n, &m, &k);     for (int i = 1, x, y; i <= k; i++) {       scanf( %d%d , &x, &y);       insert(x, y);     }     scanf( %d%d%s , &sx, &sy, s);     dir = (s[1] ==  E ) | ((s[0] ==  S ) << 1);     for (int i = 0; i <= n + 1; i++) insert(i, 0), insert(i, m + 1);     for (int i = 0; i <= m + 1; i++) insert(0, i), insert(n + 1, i);   }   void go(int x, int y, int d, int &x1, int &y1, int &d1, int &px, int &py) {     int a, b;     if (d == 0) {       set<pair<int, int> >::iterator p =           z[x - y + m + 1].lower_bound(make_pair(x, y));       p--;       px = p->first;       py = p->second;       a = use[px + 1].count(py);       b = use[px].count(py + 1);       if (!a && b) {         x1 = px + 1;         y1 = py;         d1 = 2;       } else if (a && !b) {         x1 = px;         y1 = py + 1;         d1 = 1;       } else {         x1 = px + 1;         y1 = py + 1;         d1 = 3;       }     } else if (d == 1) {       set<pair<int, int> >::iterator p = f[x + y].lower_bound(make_pair(x, y));       p--;       px = p->first;       py = p->second;       a = use[px + 1].count(py);       b = use[px].count(py - 1);       if (!a && b) {         x1 = px + 1;         y1 = py;         d1 = 3;       } else if (a && !b) {         x1 = px;         y1 = py - 1;         d1 = 0;       } else {         x1 = px + 1;         y1 = py - 1;         d1 = 2;       }     } else if (d == 2) {       set<pair<int, int> >::iterator p = f[x + y].upper_bound(make_pair(x, y));       px = p->first;       py = p->second;       a = use[px - 1].count(py);       b = use[px].count(py + 1);       if (!a && b) {         x1 = px - 1;         y1 = py;         d1 = 0;       } else if (a && !b) {         x1 = px;         y1 = py + 1;         d1 = 3;       } else {         x1 = px - 1;         y1 = py + 1;         d1 = 1;       }     } else {       set<pair<int, int> >::iterator p =           z[x - y + m + 1].upper_bound(make_pair(x, y));       px = p->first;       py = p->second;       a = use[px - 1].count(py);       b = use[px].count(py - 1);       if (!a && b) {         x1 = px - 1;         y1 = py;         d1 = 1;       } else if (a && !b) {         x1 = px;         y1 = py - 1;         d1 = 2;       } else {         x1 = px - 1;         y1 = py - 1;         d1 = 0;       }     }   }   void solve() {     long long ans = 0;     int rep = 0;     int xx, yy, dd, px, py;     go(sx, sy, dir, sx, sy, dir, px, py);     for (int x = sx, y = sy, d = dir;; x = xx, y = yy, d = dd) {       go(x, y, d, xx, yy, dd, px, py);       ans += abs(x - px);       if (xx == sx && yy == sy && dd == dir) break;       if (dd + d == 3) rep = 1;     }     if (rep) ans >>= 1;     printf( %I64d n , ans);   }   int main() {     init();     solve();     return 0;   }   