#include #include struct princ { int s; // skupina princů int i; // pozice ve skupině }; bool operator<(const princ &prvni, const princ &druhy) { return bohatsi (druhy.s+1, druhy.i+1, prvni.s+1, prvni.i+1) < 0; } int main(int argc, char* argv[]) { // načteme vstup int N, K; scanf("%d%d", &N, &K); std::vector pocty(N); for (int i=0; i halda; std::vector pozice(N, 0); while (S >= 1) { // vymažeme haldu halda = std::priority_queue(); for (int i=0; i 0) { pozice[i] -= 2*S; K += 2*S; } // a naplníme haldu princ p = { i, pozice[i] }; halda.push(p); } // zkoušíme se přiblížit k hledanému princy po krocích velikosti S for ( ; K - S > 0; K -= S) { princ p = halda.top(); halda.pop(); p.i = pozice[p.s] += S; if (p.i < pocty[p.s]) { halda.push(p); } } S /= 2; } // hledaný princ je nyní na vrcholu haldy // došli jsme k němu po K-1 krocích velikosti 1 princ hledany = halda.top(); printf("%d %d\n", hledany.s+1, hledany.i+1); return 0; }