func_code_string: #include <bits/stdc++.h>   using namespace std;   struct node {     int x, y, id;     bool operator<(const node &A) const { return x < A.x; }   };   vector<node> line[2][100005 << 2];   bool mark[2][100005 << 2];   int n, m, k;   long long t[100005];   void add(int x, int y, int i) {     node a;     a.x = x, a.y = y, a.id = i;     line[1][y - x + 200000].push_back(a);     line[0][x + y + 200000].push_back(a);   }   void solve() {     bool flag = 0, first = 0;     long long res = 0;     int k = 1;     int x = 0, y = 0;     while (!flag) {       if (x == 0 || y == 0 || x == n || y == m) {         if (first) {           if ((x == 0 || x == n) && (y == 0 || y == m)) {             flag = 1;             break;           }           k = -k;         } else           first = 1;       }       int cur = (k == 1);       if (line[cur][y - k * x + 200000].size()) {         if (mark[cur][y - k * x + 200000])           flag = 1;         else {           mark[cur][y - k * x + 200000] = 1;           if (k == 1 && (!x || !y) || k == -1 && ((!x && y) || (y == m && x))) {             for (int i = 0; i < line[cur][y - k * x + 200000].size(); i++) {               int j = line[cur][y - k * x + 200000][i].id;               node tmp = line[cur][y - k * x + 200000][i];               if (t[j]) {               } else                 t[j] = res + abs(line[cur][y - k * x + 200000][i].x - x);             }           } else {             for (int i = line[cur][y - k * x + 200000].size() - 1; i >= 0; i--) {               int j = line[cur][y - k * x + 200000][i].id;               node tmp = line[cur][y - k * x + 200000][i];               if (t[j]) {               } else                 t[j] = res + abs(line[cur][y - k * x + 200000][i].x - x);             }           }         }       }       int nx1, ny1, nx2, ny2, t1 = x, t2 = y;       if (k == 1) {         if (0 <= n + y - x && n + y - x <= m)           nx1 = n, ny1 = n + y - x;         else           ny1 = m, nx1 = m + x - y;         if (0 <= y - x && y - x <= m)           nx2 = 0, ny2 = y - x;         else           ny2 = 0, nx2 = x - y;         if (nx1 == x) {           x = nx2, y = ny2;         } else           x = nx1, y = ny1;       } else {         if (0 <= x + y && x + y <= m)           nx1 = 0, ny1 = x + y;         else           ny1 = m, nx1 = x + y - m;         if (0 <= x + y - n && x + y - n <= m)           nx2 = n, ny2 = x + y - n;         else           ny2 = 0, nx2 = x + y;         if (nx1 == x) {           x = nx2, y = ny2;         } else           x = nx1, y = ny1;       }       res += abs(x - t1);     }   }   inline void print(long long x) {     if (!x) return;     print(x / 10);     putchar(x % 10 ^ 48);   }   inline void pf(long long x) {     print(x);     if (!x)       puts( 0 );     else       puts(  );   }   inline void rd(int &res) {     res = 0;     char c;     while (c = getchar(), c <  0  || c >  9 )       ;     do {       res = (res << 3) + (res << 1) + (c ^ 48);     } while (c = getchar(),  0  <= c && c <=  9 );   }   int main() {     rd(n);     rd(m);     rd(k);     for (int i = 1; i <= k; i++) {       int a, b;       rd(a);       rd(b);       add(a, b, i);     }     for (int i = 0; i < 2; i++)       for (int j = 0; j < 2 * 100005; j++) {         if (line[i][j].size()) {           sort(line[i][j].begin(), line[i][j].end());         }       }     solve();     for (int i = 1; i <= k; i++) {       if (t[i])         pf(t[i]);       else         puts( -1 );     }     return 0;   }   