func_code_string: #include <bits/stdc++.h>   using namespace std;   const int INF = 1 << 29;   const double PI = acos(-1);   const double EPS = 1e-8;   void func(vector<pair<int, int> > &v) {     sort((v).begin(), (v).end());     int start = -1;     int end = -1;     vector<pair<int, int> > res;     for (int i = 0; i < (int)v.size(); ++i) {       if (i == 0) {         start = v[i].first;         end = v[i].second;       } else {         if (v[i].first <= end) {           (end < v[i].second ? (end = v[i].second, 1) : 0);         } else {           res.push_back(pair<int, int>(start, end));           start = v[i].first;           end = v[i].second;         }       }     }     if (start != -1) res.push_back(pair<int, int>(start, end));     v = res;   }   struct P {     int v;     int t, a;     P(int v, int t, int a) : v(v), t(t), a(a) {}   };   int maxbit(int a) {     int r = 0;     while (a) a >>= 1, r++;     return r - 1;   }   const int N = 200000;   bool tflag[N];   bool yflag[N];   int main() {     int w, h, k;     while (cin >> w >> h >> k) {       for (int i = 0; i < (int)N; ++i) tflag[i] = yflag[i] = 0;       map<int, vector<pair<int, int> > > tate, yoko;       for (int i = 0; i < (int)k; ++i) {         int x1, y1, x2, y2;         scanf( %d%d%d%d , &x1, &y1, &x2, &y2);         if (x1 == x2) {           tate[x1].push_back(pair<int, int>(min(y1, y2), max(y1, y2)));         } else {           yoko[y1].push_back(pair<int, int>(min(x1, x2), max(x1, x2)));         }       }       assert(tate.size() <= w - 1 && yoko.size() <= h - 1);       vector<P> nim;       for (__typeof((tate).begin()) it = (tate).begin(); it != (tate).end();            ++it) {         if (it->first < N) tflag[it->first] = 1;         vector<pair<int, int> > &v = it->second;         func(v);         int t = h;         for (__typeof((v).begin()) jt = (v).begin(); jt != (v).end(); ++jt) {           t -= jt->second - jt->first;         }         nim.push_back(P(t, 0, it->first));       }       for (__typeof((yoko).begin()) it = (yoko).begin(); it != (yoko).end();            ++it) {         if (it->first < N) yflag[it->first] = 1;         vector<pair<int, int> > &v = it->second;         func(v);         int t = w;         for (__typeof((v).begin()) jt = (v).begin(); jt != (v).end(); ++jt) {           t -= jt->second - jt->first;         }         nim.push_back(P(t, 1, it->first));       }       if ((w - 1 - tate.size()) % 2 == 1) {         for (int i = 1; i < w; ++i)           if (!tflag[i]) {             nim.push_back(P(h, 0, i));             break;           }       }       if ((h - 1 - yoko.size()) % 2 == 1) {         for (int i = 1; i < h; ++i)           if (!yflag[i]) {             nim.push_back(P(w, 1, i));             break;           }       }       int val = 0;       for (__typeof((nim).begin()) it = (nim).begin(); it != (nim).end(); ++it) {         val ^= it->v;       }       if (val) {         puts( FIRST );         int mb = maxbit(val);         int x1, y1, x2, y2;         for (__typeof((nim).begin()) it = (nim).begin(); it != (nim).end();              ++it) {           if ((it->v) >> mb & 1) {             int num = it->v - (it->v ^ val);             assert(num >= 1);             if (it->t == 0) {               x1 = x2 = it->a;               y1 = 0;               vector<pair<int, int> > &v = tate[it->a];               int low = 0, high = h;               while (low + 1 < high) {                 int mid = (low + high) / 2;                 int sum = mid;                 for (__typeof((v).begin()) it = (v).begin(); it != (v).end();                      ++it) {                   if (it->second <= mid)                     sum -= it->second - it->first;                   else if (it->first <= mid)                     sum -= mid - it->first;                 }                 if (sum >= num)                   high = mid;                 else                   low = mid;               }               y2 = high;             } else {               y1 = y2 = it->a;               x1 = 0;               vector<pair<int, int> > &v = yoko[it->a];               int low = 0, high = w;               while (low + 1 < high) {                 int mid = (low + high) / 2;                 int sum = mid;                 for (__typeof((v).begin()) it = (v).begin(); it != (v).end();                      ++it) {                   if (it->second <= mid)                     sum -= it->second - it->first;                   else if (it->first <= mid)                     sum -= mid - it->first;                 }                 if (sum >= num)                   high = mid;                 else                   low = mid;               }               x2 = high;             }             break;           }         }         printf( %d %d %d %d n , x1, y1, x2, y2);       } else {         puts( SECOND );       }     }   }   