program prl2; sharedvar values : array of word; // pole razenych hodnot, sdilene vsemi procesory empty : array of boolean; // pole signalizujici neprazdnost uzlu result : array of word; n : word; leafs : word; kroku : word; resultIndex : word; var i, j, i1, i2 : word; procedure init; var i : word; begin read(leafs); // nacteni poctu vstupnich hodnot // ziskani nejblizsi vyssi mocniny 2 (neni-li hodnota promenne leafs mocninou dvou) n := 2; while (n < leafs) do n := n * 2; end; // v n je nyni neblizsi vyssi mocnina 2 od poctu razenych hodnot P := n - 1; // inicializace poctu procesoru - potrebujeme je pro nelistove uzly procesoru // vyprazdnime pole empty for i := 1 to 2 * n - 1 do empty[i] := true; end; // nacteni hodnot do listu for i := n to n + leafs - 1 do empty[i] := false; read(values[i]); end; // vypocet poctu kroku k serazeni posloupnosti kroku := 2 * leafs + log(n) - 1; // nastaveni indexu pro zapis do pole vysledku resultIndex := 1; end init; procedure finish; var i : word; begin write(leafs); // vypis poctu razenych hodnot chwrite(32); for i := 1 to leafs do write(result[i]); // vypis serazenych hodnot chwrite(32); end; end finish; begin // proved vypocteny pocet kroku for i := 1 to kroku do synchronize; // iteruj synchronne pres vsechny nelistove uzly (pres vsechny procesory) par j := 1 to P sync do // vypocet indexu potomku aktualniho uzlu v poli values i1 := 2 * j; i2 := i1 + 1; if (j = 1) and (not empty[j]) then // uzel je koren a neni prazdny // uloz vysledek result[resultIndex] := values[j]; empty[j] := true; inc(resultIndex); elsif (empty[j]) then // aktualni uzel je prazdny // pokud jsou oba potomci neprazdni if ((not empty[i1]) and (not empty[i2])) then // a levy je mensi nez pravy if (values[i1] < values[i2]) then values[j] := values[i1]; empty[j] := false; empty[i1] := true; else values[j] := values[i2]; empty[j] := false; empty[i2] := true; end; elsif (empty[i1] and not empty[i2]) then values[j] := values[i2]; empty[j] := false; empty[i2] := true; elsif (not empty[i1] and empty[i2]) then values[j] := values[i1]; empty[j] := false; empty[i1] := true; end; end; end; end; @CLOCK end prl2.