// 28-5-7: Magická operace (ještě rychlejší řešení) // Autor: Medvěd #include #include "magic.h" // Maximální počet prvků a úrovní rekurze #define MAXL 20 #define MAX (1<= len) { pc(l+1, i, s); return; } int jj = (j < len) ? j : len-1; p[l][s] = nums[s]; for (int k=s-1; k>=i; k--) p[l][k] = magic_op(nums[k], p[l][k+1]); p[l][s+1] = nums[s+1]; for (int k=s+2; k<=jj; k++) p[l][k] = magic_op(p[l][k-1], nums[k]); pc(l+1, i, s); pc(l+1, s+1, j); } // Předvýpočet všech úrovní void precalc(void) { len2 = 1; levels = 0; while (len2 < len) { len2 *= 2; levels++; } bit[0] = 0; for (int i=1; i level %d/%d\n", qi, qj, b, levels); return magic_op(p[b][qi], p[b][qj]); } // Hlavní program int main(void) { magic_init(); magic_get_numbers(&nums, &len); precalc(); magic_begin(); for (int i=0; i