Cod sursa(job #1852299)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 20 ianuarie 2017 17:55:21
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <climits>
#include <algorithm>
using namespace std;

#ifdef INFOARENA
#define ProblemName "fractal"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
typedef long long LL;

#define MAXK 20
LL pw2[MAXK], ttlPts[MAXK];

void prec() {
	pw2[0] = 1LL;
	ttlPts[0] = 1LL;
	for (int i = 1; i < MAXK; ++i) {
		pw2[i] = pw2[i - 1] * 2;
		ttlPts[i] = pw2[i] * pw2[i];
	}
}

int cadran(int k, LL x, LL y) {
	LL mid = pw2[k] / 2;
	if (x < mid) {
		if (y < mid) return 0;
		return 1;
	}
	if (y < mid) return 3;
	return 2;
}

LL answer(int k, LL x, LL y) {
	if (k == 0) return 0LL;
	int cadr = cadran(k, x, y);
	LL mid = pw2[k] / 2;
	switch (cadr) {
	case 0:
		swap(x, y);
		break;
	case 1:
		y -= mid;
		break;
	case 2:
		x -= mid;
		y -= mid;
		break;
	case 3:
		x -= mid;
		swap(x, y);
		y = pw2[k - 1] - y - 1;
		x = pw2[k - 1] - x - 1;
		break;
	default:
		break;
	}
	return ttlPts[k - 1] * cadr + answer(k - 1, x, y);
}

int main() {
	freopen(InFile, "r", stdin);
	freopen(OuFile, "w", stdout);
	prec();
	int k; LL x, y;
	while (scanf("%d%lld%lld", &k, &x, &y) != EOF)
		printf("%lld\n", answer(k, x - 1, y - 1));
	return 0;
}