AOJ 1043 - Selecting Teams Advanced to Regional

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
struct team{int i, u, a, p;team(int,int,int,int);};
team::team(int _i, int _u, int _a, int _p)
	:i(_i), u(_u), a(_a), p(_p) {}

bool tsort(const team& l, const team& r){
	if(l.a == r.a){
		if(l.p == r.p)return l.i < r.i;
		return l.p < r.p;
	}
	return l.a > r.a;
}

int main(){
	int n;
	while(std::cin >> n, n){
		int i, u, a, p;
		std::vector<team> v;
		while(n--){
			std::cin >> i >> u >> a >> p;
			team t = team(i, u, a, p);
			v.push_back(t);
		}
		
		std::sort(v.begin(), v.end(), tsort);
		
		int steam = 0;
		std::map<int, int> m;
		std::vector<team>::iterator it = v.begin();
		while(it != v.end()){
			int mteam = 0;
			if(steam < 10)mteam = 3;
			else if(steam < 20)mteam = 2;
			else if(steam < 26)mteam = 1;

			if(m[(*it).u] < mteam){
				std::cout << (*it).i << std::endl;
				steam++, m[(*it).u]++;
			}
			it++;
		}
	}
}