Pagini recente » Cod sursa (job #2572894) | Cod sursa (job #1579202) | Cod sursa (job #731375) | Cod sursa (job #2680352) | Cod sursa (job #1852299)
#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;
}