Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

func configure(scanner *bufio.Scanner) {
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1000005), 1000005)
}
func getNextString(scanner *bufio.Scanner) string {
	scanned := scanner.Scan()
	if !scanned {
		panic("scan failed")
	}
	return scanner.Text()
}
func getNextInt(scanner *bufio.Scanner) int {
	i, _ := strconv.Atoi(getNextString(scanner))
	return i
}
func getNextInt64(scanner *bufio.Scanner) int64 {
	i, _ := strconv.ParseInt(getNextString(scanner), 10, 64)
	return i
}
func getNextFloat64(scanner *bufio.Scanner) float64 {
	i, _ := strconv.ParseFloat(getNextString(scanner), 64)
	return i
}
func main() {
	fp := os.Stdin
	wfp := os.Stdout
	extra := 0
	if os.Getenv("I") == "IronMan" {
		fp, _ = os.Open(os.Getenv("END_GAME"))
		extra = 100
	}
	scanner := bufio.NewScanner(fp)
	configure(scanner)
	writer := bufio.NewWriter(wfp)
	defer func() {
		r := recover()
		if r != nil {
			fmt.Fprintln(writer, r)
		}
		writer.Flush()
	}()
	solve(scanner, writer)
	for i := 0; i < extra; i++ {
		fmt.Fprintln(writer, "-----------------------------------")
		solve(scanner, writer)
	}
}
func solve(scanner *bufio.Scanner, writer *bufio.Writer) {
	for n := getNextInt(scanner); n > 0; n = getNextInt(scanner) {
		tt := make([]team, n)
		for i := 0; i < n; i++ {
			tt[i].id = getNextInt(scanner)
			tt[i].uni = getNextInt(scanner)
			tt[i].ac = getNextInt(scanner)
			tt[i].pn = getNextInt(scanner)
		}
		sort.SliceStable(tt, func(i, j int) bool {
			if tt[i].ac == tt[j].ac {
				if tt[i].pn == tt[j].pn {
					return tt[i].id < tt[j].id
				}
				return tt[i].pn < tt[j].pn
			}
			return tt[i].ac > tt[j].ac
		})
		cc := make([]int, 100005)
		ans := make([]int, 0)
		for i := 0; i < n; i++ {
			if cc[0] < 10 && cc[tt[i].uni] < 3 {
				cc[0]++
				cc[tt[i].uni]++
				ans = append(ans, tt[i].id)
				continue
			}
			if cc[0] < 20 && cc[tt[i].uni] < 2 {
				cc[0]++
				cc[tt[i].uni]++
				ans = append(ans, tt[i].id)
				continue
			}
			if cc[0] < 26 && cc[tt[i].uni] < 1 {
				cc[0]++
				cc[tt[i].uni]++
				ans = append(ans, tt[i].id)
				continue
			}
		}
		for i := 0; i < len(ans); i++ {
			fmt.Fprintln(writer, ans[i])
		}
	}
}

type team struct {
	id, uni, ac, pn int
}

C++: #include <iostream>
#include <map>
#include <set>
#include <queue>

#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;
}

C++: #include <iostream>
#include <vector>
#include <queue>
using namespace std;

class Team
{
public:
	int id, af, n, pen;
	Team(int id, int af, int n, int pen)
		: id(id), af(af), n(n), pen(pen) {}
	bool operator<(const Team& t) const {
		if (n != t.n) return n < t.n;
		else if (pen != t.pen) return pen > t.pen;
		else return id > t.id;
	}
};

int main()
{
	int N;
	while (cin >> N, N)
	{
		priority_queue<Team> pq;
		for (int i=0; i<N; i++)
		{
			int id, af, n, pen;
			cin >> id >> af >> n >> pen;
			pq.push(Team(id, af, n, pen));
		}

		int pass = 0;
		vector<int> n_af(1001,0);
		while (!pq.empty())
		{
			Team now = pq.top(); pq.pop();

			if (pass < 10)
			{
				if (n_af[now.af] < 3)
				{
					n_af[now.af]++;
					cout << now.id << endl;
					pass++;
				}
			}
			else if (pass < 20)
			{
				if (n_af[now.af] < 2)
				{
					n_af[now.af]++;
					cout << now.id << endl;
					pass++;
				}
			}
			else
			{
				if (n_af[now.af] < 1)
				{
					n_af[now.af]++;
					cout << now.id << endl;
					pass++;
				}
			}
		}
	}
}

C++: #include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

#define pii pair<int,int>
#define piiii pair<pii,pii>

int main() {
  int n;
  while(cin >> n, n) {
    vector<piiii> v;
    for (int i=0; i<n;i++) {
      int id, u, a,p;
      cin >>id>>u>>a>>p;
      piiii x = make_pair(pii(11-a,p) ,pii(id, u));
      v.push_back(x);
    }
    sort(v.begin(), v.end());
    vector<int> t(1001,0);
    int m=0;
    for(int i=0; i<v.size(); i++) {
      pii pis = v[i].second;
      int id = pis.first;
      int u = pis.second;

      if (m<10&&t[u]<3 || m<20&&t[u]<2 || m<26&&t[u]==0) {
        cout << id << endl;
        m++;
        t[u]++;
      }
    }
  }
}