Problem p03996 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <fstream>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <typeinfo>
#include <vector>

#define DIV 1000000007

using namespace std;

long long N, M, Q;
long long a[100005];
long long b[100005];
long long idx[100005];

vector<long long> ans;
set<long long> done;

int main() {
  cin >> N >> M >> Q;
  for (int i = 0; i < Q; i++) {
    cin >> a[i];
    a[i]--;
  }

  // create correct
  for (int i = Q - 1; i >= 0; i--) {
    if (done.count(a[i]) == 0) {
      ans.push_back(a[i]);
      done.insert(a[i]);
    }
  }
  for (int i = 0; i < M; i++) {
    if (done.count(i) == 0) {
      ans.push_back(i);
      done.insert(i);
    }
  }

  for (int i = 0; i < ans.size(); i++) {
    idx[ans[i]] = i;
  }
  b[0] = N;

  for (int i = Q - 1; i >= 0; i--) {
    if (b[idx[a[i]]] > 0) {
      b[idx[a[i]]]--;
      b[idx[a[i]] + 1]++;
    }
  }

  long long mini = INT_MAX;
  for (long long i = 0; i < M; i++) {
    // cout << "b[" << i << "]=" << b[i] << endl;
    if (b[i] > 0) {
      mini = min(mini, i);
    }
  }

  done.clear();
  for (int i = 0; i < mini; i++) {
    done.insert(ans[i]);
  }
  long long idx = mini;

  for (int i = 0; i < M; i++) {
    if (done.count(i) == 0) {
      // cout << "i=" << i << " idx = " << idx << endl;
      if (ans[idx] != i) {
        cout << "No" << endl;
        return 0;
      }
      idx++;
    }
  }
  cout << "Yes" << endl;

  // for(long long i = mini; i < M; i++){
  //	if(ans[i] != i){
  //		cout << "No" << endl;
  //		return 0;
  //	}
  // }
  // cout << "Yes" << endl;
}

Fixed submission:
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <fstream>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <typeinfo>
#include <vector>

#define DIV 1000000007

using namespace std;

long long N, M, Q;
long long a[100005];
long long b[100005];
long long idx[100005];

vector<long long> ans;
set<long long> done;

int main() {
  cin >> N >> M >> Q;
  for (int i = 0; i < Q; i++) {
    cin >> a[i];
    a[i]--;
  }

  // create correct
  for (int i = Q - 1; i >= 0; i--) {
    if (done.count(a[i]) == 0) {
      ans.push_back(a[i]);
      done.insert(a[i]);
    }
  }
  for (int i = 0; i < M; i++) {
    if (done.count(i) == 0) {
      ans.push_back(i);
      done.insert(i);
    }
  }

  for (int i = 0; i < ans.size(); i++) {
    idx[ans[i]] = i;
  }
  b[0] = N;

  for (int i = Q - 1; i >= 0; i--) {
    if (b[idx[a[i]]] > 0) {
      b[idx[a[i]]]--;
      b[idx[a[i]] + 1]++;
    }
  }

  long long mini = M;
  for (long long i = 0; i < M; i++) {
    // cout << "b[" << i << "]=" << b[i] << endl;
    if (b[i] > 0) {
      mini = min(mini, i);
    }
  }

  done.clear();
  for (int i = 0; i < mini; i++) {
    done.insert(ans[i]);
  }
  long long idx = mini;

  for (int i = 0; i < M; i++) {
    if (done.count(i) == 0) {
      // cout << "i=" << i << " idx = " << idx << endl;
      if (ans[idx] != i) {
        cout << "No" << endl;
        return 0;
      }
      idx++;
    }
  }
  cout << "Yes" << endl;

  // for(long long i = mini; i < M; i++){
  //	if(ans[i] != i){
  //		cout << "No" << endl;
  //		return 0;
  //	}
  // }
  // cout << "Yes" << endl;
}