Problem p00629 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <iostream>
#include <map>
#include <queue>
#include <set>

#define rep(i, s, t) for (int i = s; i < t; i++)
#define mp(a, b) make_pair(a, b)

using namespace std;

int main(void) {
  int n;
  int id, u, a, p;

  // 降順でkeyにスコア，Valueに 昇順でkeyにペナルティ valueに 昇順でKeyにid番号
  // valueに所属を保持する3重map これを用いてスコアをソートする
  map<int, map<int, map<int, int>>, greater<int>> ranking;
  // それぞれのチームの数を保持する配列
  int team[1001];
  // 選ばれたチームのチームIDを保持するキュー
  queue<int> select;

  while (cin >> n) {
    // スコアリストをクリアする
    ranking.clear();
    if (n == 0)
      break;

    // それぞのチームのスコアを3重mapに挿入していく
    rep(i, 0, n) {
      cin >> id >> u >> a >> p;
      // 登場する大学のidのみを初期化する
      team[u] = 0;
      ranking[a][p][id] = u;
    }
    // スコア順に並べた3重mapを上位から順に処理する
    bool interupt = false;
    for (map<int, map<int, map<int, int>>, greater<int>>::iterator it =
             ranking.begin();
         it != ranking.end() && !interupt; it++) {
      for (map<int, map<int, int>>::iterator jt = (*it).second.begin();
           jt != (*it).second.end() && !interupt; jt++) {
        for (map<int, int>::iterator kt = (*jt).second.begin();
             kt != (*jt).second.end() && !interupt; kt++) {
          int tid = (*kt).first;
          int tsc = (*kt).second;
          // tema数が10未満の場合
          if (select.size() < 10) {
            if (team[tsc] < 3) {
              select.push(tid);
              team[tsc]++;
            }
            // tema数が20未満の場合
          } else if (select.size() < 20) {
            if (team[tsc] < 2) {
              select.push(tid);
              team[tsc]++;
            }
            // tema数が26未満の場合
          } else if (select.size() < 26) {
            if (team[tsc] < 1) {
              select.push(tid);
              team[tsc]++;
            }
            // tema数が26を超えた場合はカウントを打ち切る
          } else {
            interupt = true;
          }
        }
      }
    }
    // キューを先頭から出力していく
    while (!select.empty()) {
      cout << select.front() << endl;
      select.pop();
    }
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <iostream>
#include <map>
#include <queue>
#include <set>

#define rep(i, s, t) for (int i = s; i < t; i++)
#define mp(a, b) make_pair(a, b)

using namespace std;

int main(void) {
  int n;
  int id, u, a, p;

  // 降順でkeyにスコア，Valueに 昇順でkeyにペナルティ valueに 昇順でKeyにid番号
  // valueに所属を保持する3重map これを用いてスコアをソートする
  map<int, map<int, map<int, int>>, greater<int>> ranking;
  // それぞれのチームの数を保持する配列
  int team[1001];
  // 選ばれたチームのチームIDを保持するキュー
  queue<int> select;

  while (cin >> n) {
    // スコアリストをクリアする
    ranking.clear();
    if (n == 0)
      break;

    // それぞのチームのスコアを3重mapに挿入していく
    rep(i, 0, n) {
      cin >> id >> u >> a >> p;
      // 登場する大学のidのみを初期化する
      team[u] = 0;
      ranking[a][p][id] = u;
    }
    // スコア順に並べた3重mapを上位から順に処理する
    for (map<int, map<int, map<int, int>>, greater<int>>::iterator it =
             ranking.begin();
         it != ranking.end(); it++) {
      for (map<int, map<int, int>>::iterator jt = (*it).second.begin();
           jt != (*it).second.end(); jt++) {
        for (map<int, int>::iterator kt = (*jt).second.begin();
             kt != (*jt).second.end(); kt++) {
          int tid = (*kt).first;
          int tsc = (*kt).second;
          // tema数が10未満の場合
          if (select.size() < 10) {
            if (team[tsc] < 3) {
              select.push(tid);
              team[tsc]++;
            }
            // tema数が20未満の場合
          } else if (select.size() < 20) {
            if (team[tsc] < 2) {
              select.push(tid);
              team[tsc]++;
            }
            // tema数が26未満の場合
          } else if (select.size() < 26) {
            if (team[tsc] < 1) {
              select.push(tid);
              team[tsc]++;
            }
            // tema数が26を超えた場合はカウントを打ち切る
          } else {
            kt = (*jt).second.end();
            jt = (*it).second.end();
            it = ranking.end();
          }
        }
      }
    }
    // キューを先頭から出力していく
    while (!select.empty()) {
      cout << select.front() << endl;
      select.pop();
    }
  }

  return 0;
}