func_code_string: #include <bits/stdc++.h>   using namespace std;   int N, M;   vector<pair<int, int> > V;   int main(int argc, const char *argv[]) {     cin >> N >> M;     for (int i = 0, x, y; i < M; i++) {       cin >> x >> y;       V.push_back(pair<int, int>(x, y));     }     sort(V.begin(), V.end());     vector<pair<int, int> > currI;     currI.push_back(pair<int, int>(1, 1));     int currRow = 0;     for (int i = 0; i < V.size();) {       pair<int, int> p = V[i];       vector<pair<int, int> > newI;       if (p.first > currRow + 1 && currI.size()) {         int left = currI[0].first;         currI.clear();         currI.push_back(pair<int, int>(left, N));       }       currRow = p.first;       vector<pair<int, int> > temp;       int last = 0;       while (i < V.size() && V[i].first == p.first) {         temp.push_back(pair<int, int>(last + 1, V[i].second - 1));         last = V[i].second;         i++;       }       temp.push_back(pair<int, int>(last + 1, N));       int j = 0;       for (auto x : temp) {         while (j < currI.size() && currI[j].second < x.first) j++;         if (j < currI.size()) {           int x1 = max(x.first, currI[j].first), x2 = x.second;           if (x2 >= x1) {             newI.push_back(pair<int, int>(x1, x2));           }         }       }       currI = newI;     }     bool poss = false;     if (currI.size() > 0) {       pair<int, int> l = currI[currI.size() - 1];       poss = (currRow < N && l.second <= N);       poss = poss || (currRow == N && l.second == N);     }     if (poss) {       cout << 2 * (N - 1) << endl;     } else {       cout << -1 << endl;     }     return 0;   }   