View difference between Paste ID: nBSKRPzy and huRLy5mT
SHOW: | | - or go back to the newest paste.
1
#!/usr/bin/perl
2
3
use warnings;
4
use strict;
5
6
my $N = 10000000;
7
my @a; 
8
9
sub pushDown {
10
    my ($pos, $N) = @_; 
11
    while (2 * $pos + 1 < $N) {
12
        my $j = 2 * $pos + 1;
13
        if ($j + 1 < $N && $a[$j + 1] > $a[$j]) {
14
            ++$j;
15
        }   
16
        last if $a[$pos] >= $a[$j];
17
        @a[$pos, $j] = @a[$j, $pos];
18
        $pos = $j; 
19
    }   
20
}
21
22
@a = 0 .. $N-1;
23
24
pushDown($_, $N) for reverse 0 .. $N / 2;
25
26
my $n = $N; 
27
while ($n > 1) {
28
    @a[0, $n - 1] = @a[$n - 1, 0]; 
29
    --$n;
30
    pushDown(0, $n);
31
}
32
33
while (my ($id, $key) = each @a) {
34
    die unless $id == $key;
35
}