이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using vi = vector<int>;
using vpi = vector<pii>;
using vvi = vector<vi>;
const vector<pii> EMP = {};
 
int f(vi &X, int x) { return lower_bound(X.begin(), X.end(), x) - X.begin() + 1; }
pii its(pii l, pii r) { return {max(l.first, r.first), min(l.second, r.second)}; }
vi X, Y; int XS, YS;
 
vvi rem(vvi &A, int x, int y) {
	vvi ret;
	for(auto& it: A) if(it[2] < x || x < it[0] || it[3] < y || y < it[1]) ret.push_back(it);
	return ret;
}
 
vvi intersect_line(vvi &A, int x, int y) {
	vvi ret;
	if(x) for(auto& it: A) if(it[0] <= x || x <= it[2]) ret.push_back(it);
	if(y) for(auto& it: A) if(it[1] <= y || y <= it[3]) ret.push_back(it);
	return ret;
}
 
vpi sol4(vvi A) {
	int mnr = XS, mxl = 1, mnu = YS, mxd = 1;
	for(auto& it: A) {
		mnr = min(mnr, it[2]);
		mxl = max(mxl, it[0]);
		mnu = min(mnu, it[3]);
		mxd = max(mxd, it[1]);
	}
	vvi B;
	for(auto& it: A) {
		int cnt = 0;
		for(auto& x: {mnr, mxl}) for(auto& y: {mnu, mxd}) if(it[0] <= x && x <= it[2] && it[1] <= y && y <= it[3]) ++cnt;
		if(cnt <= 1) B.push_back(it);
	}
	A = B;
	for(auto& it: A) if(mnr < it[0] && it[2] < mxl && mnu < it[1] && it[3] < mxd) return EMP;
 
	vvi L = intersect_line(A, mnr, 0);
	int only_L_mxd = mnu + 1, only_L_mnu = mxd - 1;
	for(auto& it: L) if(it[2] < mxl && mnu < it[1] && it[3] < mxd) {
		only_L_mxd = max(only_L_mxd, it[1]);
		only_L_mnu = min(only_L_mnu, it[3]);
	}
 
	vi D_mnr(YS + 1, mxl - 1);
	for(auto& it: L) D_mnr[it[3]] = min(D_mnr[it[3]], it[2]);
	for(int i=1; i<=YS; i++) D_mnr[i] = min(D_mnr[i-1], D_mnr[i]);
 
	vi U_mnr(YS + 2, mxl - 1);
	for(auto& it: L) U_mnr[it[1]] = min(U_mnr[it[1]], it[2]);
	for(int i=YS; i>=1; i--) U_mnr[i] = min(U_mnr[i+1], U_mnr[i]);
 
 	vvi U = intersect_line(A, 0, mxd);
	int new_mnr = mxl - 1;
	for(auto& it: U) if(mnr < it[0] && it[2] < mxl) new_mnr = min(new_mnr, it[2]);
 
	int only_D_mnr = mxl - 1;
	vvi D = intersect_line(A, 0, mnu);
	for(auto& it: D) if(mnr < it[0] && it[2] < mxl && it[3] < mxd) only_D_mnr = min(only_D_mnr, it[2]);
	vvi UD = intersect_line(D, 0, mxd);
	vi UD_mnr(XS + 2, mxl - 1);
	for(auto& it: UD) UD_mnr[it[0]] = min(UD_mnr[it[0]], it[2]);
	for(int i=XS; i>=1; i--) UD_mnr[i] = min(UD_mnr[i+1], UD_mnr[i]);
 
	vvi R = intersect_line(A, mxl, 0);
	vvi RU = intersect_line(R, 0, mxd);
	vvi RD = intersect_line(R, 0, mnu);
 
	vi RU_mxd(XS + 2, mnu + 1);
	for(auto& it: RU) if(it[1] > mnu) RU_mxd[it[0]] = max(RU_mxd[it[0]], it[1]);
	for(int i=XS; i>=1; i--) RU_mxd[i] = max(RU_mxd[i+1], RU_mxd[i]);
 
	vi RD_mnu(XS + 2, mxd - 1);
	for(auto& it: RD) if(it[3] < mxd) RD_mnu[it[0]] = min(RD_mnu[it[0]], it[3]);
	for(int i=XS; i>=1; i--) RD_mnu[i] = min(RD_mnu[i+1], RD_mnu[i]);
 
	int only_R_mxd = mnu + 1, only_R_mnu = mxd - 1;
	for(auto& it: R) if(it[1] > mnu && it[3] < mxd && mnr < it[0]) {
		only_R_mxd = max(only_R_mxd, it[1]);
		only_R_mnu = min(only_R_mnu, it[3]);
	}
	vvi LR = intersect_line(R, mnr, 0);
	vpi LRU(YS + 1, {mnu + 1, mxd - 1}), LRD(YS + 2, {mnu + 1, mxd - 1});
	for(auto& it: LR) if(it[1] > mnu && it[3] < mxd) {
		LRU[it[3]] = its(LRU[it[3]], {it[1], it[3]});
		LRD[it[1]] = its(LRD[it[1]], {it[1], it[3]});
	}
	for(int i=1; i<=YS; i++) LRU[i] = its(LRU[i-1], LRU[i]);
	for(int i=YS; i>=1; i--) LRD[i] = its(LRD[i+1], LRD[i]);
 
	for(int ly=only_L_mxd; ly<=only_L_mnu; ly++) {
		int ux = min(U_mnr[ly + 1], new_mnr);
		int dx = min({D_mnr[ly - 1], only_D_mnr, UD_mnr[ux + 1]});
		int r_mxd = max({RU_mxd[ux + 1], only_R_mxd, LRU[ly - 1].first, LRD[ly + 1].first});
		int r_mnu = min({RD_mnu[dx + 1], only_R_mnu, LRU[ly - 1].second, LRD[ly + 1].second});
		//printf("ly: %d, ux: %d, dx: %d, r_mxd: %d, r_mnu: %d\n", ly, ux, dx, r_mxd, r_mnu);
		if(ux <= dx && r_mxd <= r_mnu) return {{mnr, ly}, {ux, mxd}, {dx, mnu}, {mxl, r_mxd}};
	}
 
	return EMP;
}
 
vpi sol(vvi &A, int K) {
	int mnr = XS, mxl = 1, mnu = YS, mxd = 1;
	for(auto& it: A) {
		mnr = min(mnr, it[2]);
		mxl = max(mxl, it[0]);
		mnu = min(mnu, it[3]);
		mxd = max(mxd, it[1]);
	}
	if(K == 1) {	
		if(mxl <= mnr && mxd <= mnu) return {{mxl, mxd}};
		return EMP;
	}
	if(K == 2) {
		vvi B; vpi S;
		for(auto y: {mxd, mnu}) {
			B = rem(A, mxl, y);
			S = sol(B, 1);
			if(S.size()) return {{mxl, y}, S[0]};
		}
		return EMP;
	}
	if(K == 3) {
		vvi B; vpi S;
		for(auto x: {mxl, mnr}) for(auto y: {mxd, mnu}) {
			B = rem(A, x, y);
			S = sol(B, 2);
			if(S.size()) return {{x, y}, S[0], S[1]};
		}
		return EMP;
	}
	if(K == 4) {
		vvi B; vpi S;
		for(auto x: {mxl, mnr}) for(auto y: {mxd, mnu}) {
			B = rem(A, x, y);
			S = sol(B, 3);
			if(S.size()) return {{x, y}, S[0], S[1], S[2]};
		}
		S = sol4(A);
		if(S.size()) return S;
		for(auto& it: A) it = {XS - it[2] + 1, it[1], XS - it[0] + 1, it[3]};
		S = sol4(A);
		for(auto& it: A) it = {XS - it[2] + 1, it[1], XS - it[0] + 1, it[3]};
		if(S.size()) {
			for(auto& [x, y]: S) x = XS - x + 1;
			return S;
		}
		return EMP;
	}
}
int rnd(int l, int r) {
	return l + rand() % (r-l+1);
}
int main() {
	vvi A; 
	int N, K; scanf("%d%d", &N, &K);
	for(int i=0; i<N; i++) {
		vi H(4);
		for(int j=0; j<4; j++) scanf("%d", &H[j]);
		A.push_back(H);
		X.push_back(H[0]);
		X.push_back(H[2]);
		Y.push_back(H[1]);
		Y.push_back(H[3]);
	}
	sort(X.begin(), X.end()); X.resize(unique(X.begin(), X.end()) - X.begin()); XS = X.size();
	sort(Y.begin(), Y.end()); Y.resize(unique(Y.begin(), Y.end()) - Y.begin()); YS = Y.size();
	for(auto& it: A) {
		it[0] = f(X, it[0]);
		it[1] = f(Y, it[1]);
		it[2] = f(X, it[2]);
		it[3] = f(Y, it[3]);
	}
	vpi ans;
	for(int k=1; k<=K && ans.empty(); k++) ans = sol(A, k);
	assert(!ans.empty());
	while((int)ans.size() < K) ans.push_back({1, 1});
	for(auto& [x, y]: ans) printf("%d %d\n", X[x-1], Y[y-1]);
	/*
	int N = 5, K = 4;
	srand(1235);
	while(1) {
		vvi A;
		X.clear();
		Y.clear();
		for(int i=0; i<N; i++) {
			vi H = {rnd(1, 2*N), rnd(1, 2*N), rnd(1, 2*N), rnd(1, 2*N)};
			if(H[0] > H[2]) swap(H[0], H[2]);
			if(H[1] > H[3]) swap(H[1], H[3]);
			A.push_back(H);
			X.push_back(H[0]);
			X.push_back(H[2]);
			Y.push_back(H[1]);
			Y.push_back(H[3]);
		}
		sort(X.begin(), X.end()); X.resize(unique(X.begin(), X.end()) - X.begin()); XS = X.size();
		sort(Y.begin(), Y.end()); Y.resize(unique(Y.begin(), Y.end()) - Y.begin()); YS = Y.size();
		for(auto& it: A) {
			it[0] = f(X, it[0]);
			it[1] = f(Y, it[1]);
			it[2] = f(X, it[2]);
			it[3] = f(Y, it[3]);
		}
		vpi ans;
		for(int k=1; k<=K && ans.empty(); k++) ans = sol(A, k);
		if(ans.empty()) {
			for(auto& it: A) printf("%d %d %d %d\n", it[0], it[1], it[2], it[3]);
			return 0;
		}
	}
	*/
	return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
hamburg.cpp: In function 'vpi sol(vvi&, int)':
hamburg.cpp:159:1: warning: control reaches end of non-void function [-Wreturn-type]
  159 | }
      | ^
hamburg.cpp: In function 'int main()':
hamburg.cpp:167:17: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  167 |  int N, K; scanf("%d%d", &N, &K);
      |            ~~~~~^~~~~~~~~~~~~~~~
hamburg.cpp:170:31: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  170 |   for(int j=0; j<4; j++) scanf("%d", &H[j]);
      |                          ~~~~~^~~~~~~~~~~~~| # | 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... |