{ Greedy dividing cycles } {$APPTYPE CONSOLE} {$B-,R-,O+} const maxn=256; var fi,fo:text; n,m,h,i,j,numcol:smallint; ans:smallint; a:array[1..maxn] of smallint; color:array[1..maxn] of smallint; procedure Search(l,r,h:smallint); var mid,i,j,k:smallint; begin mid:=(l+r)div 2; if(r>l)then begin Search(l,mid,h-1); Search(mid+1,r,h-1); end; for i:=l to mid do for j:=mid+1 to r do if(color[i]=color[j])then begin inc(numcol); k:=a[i]; repeat color[k]:=numcol; k:=a[k]; until k=a[j]; inc(ans,h); k:=a[i]; a[i]:=a[j]; a[j]:=k; end; end; begin assign(fi,'catacomb.dat'); assign(fo,'catacomb.sol'); reset(fi); rewrite(fo); readln(fi,n); n:=1 shl n; for i:=1 to n do read(fi,a[i]); m:=1; h:=1; while(2*m