func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class T>   bool uin(T &a, T b) {     return a > b ? (a = b, true) : false;   }   template <class T>   bool uax(T &a, T b) {     return a < b ? (a = b, true) : false;   }   struct TPoint {     long long x, y;     TPoint(long long x, long long y) : x(x), y(y) {}     TPoint operator+(const TPoint &p) const { return TPoint(x + p.x, y + p.y); }     TPoint operator-(const TPoint &p) const { return TPoint(x - p.x, y - p.y); }     long long operator%(const TPoint &p) const { return x * p.y - y * p.x; }     long long operator*(const TPoint &p) const { return x * p.x + y * p.y; }     long long operator~() const { return *this * *this; }     bool operator<(const TPoint &p) const {       return make_pair(x, y) < make_pair(p.x, p.y);     }   };   bool cmp(const TPoint &a, const TPoint &b) {     if (a % b) return a % b > 0;     return ~a < ~b;   }   const int maxn = 210000;   int miny[maxn], maxy[maxn];   int main() {     ios::sync_with_stdio(false);     cin.tie(nullptr);     cout.precision(10);     cout << fixed;     int n, m;     while (1) {       cin >> n >> m;       if (!n) break;       for (int i = 0; i < (int)(n + 10); ++i) miny[i] = 1e9, maxy[i] = -1e9;       for (int i = 0; i < (int)(m); ++i) {         int x, y;         cin >> x >> y;         uin(miny[x], y);         uax(maxy[x], y);       }       vector<TPoint> p;       for (int i = 0; i < (int)(n + 2); ++i) {         if (i && miny[i] < miny[i - 1]) p.push_back(TPoint(i, miny[i]));         if (miny[i] < miny[i + 1]) p.push_back(TPoint(i - 1, miny[i]));         if (i && maxy[i] > maxy[i - 1]) p.push_back(TPoint(i, maxy[i] - 1));         if (maxy[i] > maxy[i + 1]) p.push_back(TPoint(i - 1, maxy[i] - 1));       }       TPoint O = *min_element((p).begin(), (p).end());       for (auto &w : p) w = w - O;       sort((p).begin(), (p).end(), cmp);       vector<TPoint> st;       for (auto w : p) {         while (st.size() > 1) {           TPoint prv = st.back(), pprv = st[st.size() - 2];           if ((w - pprv) % (prv - pprv) >= 0)             st.pop_back();           else             break;         }         st.push_back(w);       }       reverse((st).begin(), (st).end());       for (int i = 0; i < (int)(st.size()); ++i) {         st[i] = st[i] + O;       }       int j = min_element((st).begin(), (st).end()) - st.begin();       cout << st.size() <<   n ;       for (int i = 0; i < (int)(st.size()); ++i) {         TPoint w = st[(i + j) % st.size()];         cout << w.x <<     << w.y <<   n ;       }     }     return 0;   }   