Problem p00440 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int INF = 1e9;
const ll LINF = 1e18;
template <class S, class T>
ostream &operator<<(ostream &out, const pair<S, T> &o) {
  out << "(" << o.first << "," << o.second << ")";
  return out;
}
template <class T> ostream &operator<<(ostream &out, const vector<T> V) {
  for (int i = 0; i < V.size(); i++) {
    out << V[i];
    if (i != V.size() - 1)
      out << " ";
  }
  return out;
}
template <class T>
ostream &operator<<(ostream &out, const vector<vector<T>> Mat) {
  for (int i = 0; i < Mat.size(); i++) {
    if (i != 0)
      out << endl;
    out << Mat[i];
  }
  return out;
}
template <class S, class T>
ostream &operator<<(ostream &out, const map<S, T> mp) {
  out << "{ ";
  for (auto it = mp.begin(); it != mp.end(); it++) {
    out << it->first << ":" << it->second;
    if (mp.size() - 1 != distance(mp.begin(), it))
      out << ", ";
  }
  out << " }";
  return out;
}

/*
 <url:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0517>
 問題文============================================================
 =================================================================
 解説=============================================================
 ================================================================
 */

ll n, k;
ll solve() {
  ll res = 0;
  bool hakusi = false;
  vector<ll> card;
  for (int i = 0; i < k; i++) {
    ll c;
    cin >> c;
    if (c == 0)
      hakusi = true;
    else
      card.push_back(c);
  }
  sort(card.begin(), card.end());
  vector<pll> sec;

  ll l = card[0], r = card[0];
  for (int i = 1; i < card.size(); i++) {
    if (card[i] == card[i - 1] + 1) {
      r = card[i];
    } else {
      sec.push_back({l, r});
      l = r = card[i];
    }
  }
  sec.push_back({l, r});

  cerr << sec << endl;
  for (int i = 0; i < sec.size(); i++) {
    res = max(res, sec[i].second - sec[i].first + 1);
    if (sec[i].first != 1 || sec[i].second != n) {
      res = max(res, sec[i].second - sec[i].first + 1 + hakusi);
    }
  }
  if (hakusi) {
    for (int i = 1; i < sec.size(); i++) {
      if (sec[i - 1].second + 2 == sec[i].first) {
        res = max(res, sec[i].second - sec[i - 1].first + 1);
      }
    }
  }
  return res;
}
int main(void) {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  while (cin >> n >> k, n) {
    cout << solve() << endl;
  }
  return 0;
}


Fixed submission:
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int INF = 1e9;
const ll LINF = 1e18;
template <class S, class T>
ostream &operator<<(ostream &out, const pair<S, T> &o) {
  out << "(" << o.first << "," << o.second << ")";
  return out;
}
template <class T> ostream &operator<<(ostream &out, const vector<T> V) {
  for (int i = 0; i < V.size(); i++) {
    out << V[i];
    if (i != V.size() - 1)
      out << " ";
  }
  return out;
}
template <class T>
ostream &operator<<(ostream &out, const vector<vector<T>> Mat) {
  for (int i = 0; i < Mat.size(); i++) {
    if (i != 0)
      out << endl;
    out << Mat[i];
  }
  return out;
}
template <class S, class T>
ostream &operator<<(ostream &out, const map<S, T> mp) {
  out << "{ ";
  for (auto it = mp.begin(); it != mp.end(); it++) {
    out << it->first << ":" << it->second;
    if (mp.size() - 1 != distance(mp.begin(), it))
      out << ", ";
  }
  out << " }";
  return out;
}

/*
 <url:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0517>
 問題文============================================================
 =================================================================
 解説=============================================================
 ================================================================
 */

ll n, k;
ll solve() {
  ll res = 0;
  bool hakusi = false;
  vector<ll> card;
  for (int i = 0; i < k; i++) {
    ll c;
    cin >> c;
    if (c == 0)
      hakusi = true;
    else
      card.push_back(c);
  }
  sort(card.begin(), card.end());
  vector<pll> sec;

  ll l = card[0], r = card[0];
  for (int i = 1; i < card.size(); i++) {
    if (card[i] == card[i - 1] + 1) {
      r = card[i];
    } else {
      sec.push_back({l, r});
      l = r = card[i];
    }
  }
  sec.push_back({l, r});

  for (int i = 0; i < sec.size(); i++) {
    res = max(res, sec[i].second - sec[i].first + 1);
    if (sec[i].first != 1 || sec[i].second != n) {
      res = max(res, sec[i].second - sec[i].first + 1 + hakusi);
    }
  }
  if (hakusi) {
    for (int i = 1; i < sec.size(); i++) {
      if (sec[i - 1].second + 2 == sec[i].first) {
        res = max(res, sec[i].second - sec[i - 1].first + 1);
      }
    }
  }
  return res;
}
int main(void) {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  while (cin >> n >> k, n) {
    cout << solve() << endl;
  }
  return 0;
}