This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define sz(x) ((int)x.size())
#define MP make_pair
#define MP3(a, b, c) MP(MP(a, b), c)
#define PB push_back
#define all(x) x.begin(),x.end()
#define pii pair<int, int>
#define piis pair<pii, string>
#define ft first
#define sd second
using namespace std;
const int N = 200100;
vector<int> vc, vec[10];
int n;
void BAD(){
	cout << -1;
	exit(0);
}
int main(){
	
	ios_base::sync_with_stdio(0); cin.tie(0);
	
//	freopen("in.txt","r",stdin); 
	
	cin >> n;
	
	for (int i = 0; i < n; i++){
		int x, v;
		cin >> x >> v;
		vec[x].PB(v);
	}
	
	for (int i = 1; i < 9; i++){
		sort(all(vec[i]));
		reverse(all(vec[i]));
	}
	
	if (sz(vec[5])){
		swap(vec[6], vec[5]);
		swap(vec[7], vec[8]);
		
		swap(vec[2], vec[3]);
		swap(vec[1], vec[4]);
	}
	
	vc.PB(vec[6][0]);
	vec[6].pop_back();
	
	if (sz(vec[8])){
		if (!sz(vec[1]))
			BAD();
		
		if (sz(vec[1]) != sz(vec[4]) + 1)
			BAD();
		
		for (int it = 0; it < n - 2; ){
			if (sz(vec[1]) == 1){
				if (sz(vec[2]) > 0){
					vc.PB(vec[2].back());
					vec[2].pop_back();
				} else {
					vc.PB(vec[1][0]);
					vec[1].pop_back();
				}
				it++;
			} else {
				if (sz(vec[1]) == 0){
					vc.PB(vec[3].back());
					vec[3].pop_back();
					it++;
				} else {
					if (!sz(vec[2]) || (sz(vec[2]) && vec[1].back() < vec[2].back())){
						vc.PB(vec[1].back());
						vec[1].pop_back();
						it++;
						
						while (sz(vec[3]) > 0 && vec[3].back() < vec[4].back()){
							vc.PB(vec[3].back());
							vec[3].pop_back();
							it++;
						}
						
						vc.PB(vec[4].back());
						vec[4].pop_back();
						it++;
					} else {
						vc.PB(vec[2].back());
						vec[2].pop_back();
						it++;
					}
				}
			}
		}
		
		vc.PB(vec[8][0]);
	} else {
		
		if (sz(vec[1]) != sz(vec[4])) 
			BAD();
		
		if (sz(vec[1]) == 0 && sz(vec[3]) > 0)
			BAD();
		
		for (int it = 0; it < n - 2; ){
			if (sz(vec[2]) && (!sz(vec[1]) || (sz(vec[1]) && vec[2].back() < vec[1].back()))){
				vc.PB(vec[2].back());
				vec[2].pop_back();
				it++;
			} else {
				vc.PB(vec[1].back());
				vec[1].pop_back();
				it++;
				
				if (sz(vec[1]) == 0){
					while (sz(vec[3]) > 0){
						vc.PB(vec[3].back());
						vec[3].pop_back();
						it++;
					}
					vc.PB(vec[4].back());
					vec[4].pop_back();
					it++;
					
				} else {
					while (sz(vec[3]) > 0 && vec[3].back() < vec[4].back()){
						vc.PB(vec[3].back());
						vec[3].pop_back();
						it++;
					}
					vc.PB(vec[4].back());
					vec[4].pop_back();
					it++;
				}
			}
		}
		
		vc.PB(vec[7][0]);
	}
	
	for (int x : vc)
		cout << x << " ";
	
	return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |