mergeInvCount <- function ( arr, from = 1 , to = length( arr) )
{
if ( from == to ) list( invs = 0 , sorted = c( arr[ from] ) )
else
{
div <- as.
integer ( ( from
+ to
) / 2 ) left
<- mergeInvCount
( arr
, from
, div ) right
<- mergeInvCount
( arr
, div + 1 , to
) sorted <- vector( "integer" , length = to - from + 1 )
rlen <- length( right$sorted)
llen <- length( left$sorted)
index <- 1
r <- 1
l <- 1
invs <- 0
while ( r <= rlen && l <= llen)
{
if ( left$sorted[ l] > right$sorted[ r] )
{
sorted[ index] <- right$sorted[ r]
r <- r + 1
invs <- invs + llen - l + 1
}
else
{
sorted[ index] <- left$sorted[ l]
l <- l + 1
}
index <- index + 1
}
while ( l <= llen) { sorted[ index] <- left$sorted[ l] ; index<- index+ 1 ; l<- l+ 1 ; }
while ( r <= rlen) { sorted[ index] <- right$sorted[ r] ; index<- index+ 1 ; r<- r+ 1 ; }
list( invs = left$invs + right$invs + invs, sorted = sorted)
}
}
array <- read.table ( "IntegerArray.txt" ) [ , 1 ]
result <- mergeInvCount( array) $invs
bWVyZ2VJbnZDb3VudCA8LSBmdW5jdGlvbiggYXJyLCBmcm9tID0gMSwgdG8gPSBsZW5ndGgoYXJyKSApCnsKICBpZiggZnJvbSA9PSB0byApIGxpc3QoIGludnMgPSAwLCBzb3J0ZWQgPSBjKGFycltmcm9tXSkpCiAgZWxzZQogIHsKICAgIGRpdiA8LSBhcy5pbnRlZ2VyKCAoZnJvbSArIHRvKSAvIDIgKQogICAgbGVmdCA8LSBtZXJnZUludkNvdW50KGFyciwgZnJvbSwgZGl2KQogICAgcmlnaHQgPC0gbWVyZ2VJbnZDb3VudChhcnIsIGRpdisxLCB0bykKICAgIHNvcnRlZCA8LSB2ZWN0b3IoImludGVnZXIiLCBsZW5ndGggPSB0byAtIGZyb20gKyAxKQogICAgcmxlbiA8LSBsZW5ndGgocmlnaHQkc29ydGVkKQogICAgbGxlbiA8LSBsZW5ndGgobGVmdCRzb3J0ZWQpCiAgICBpbmRleCA8LSAxCiAgICByIDwtIDEKICAgIGwgPC0gMQogICAgaW52cyA8LSAwCiAgICB3aGlsZShyIDw9IHJsZW4gJiYgbCA8PSBsbGVuKQogICAgewogICAgICBpZihsZWZ0JHNvcnRlZFtsXSA+IHJpZ2h0JHNvcnRlZFtyXSkKICAgICAgewogICAgICAgIHNvcnRlZFtpbmRleF0gPC0gcmlnaHQkc29ydGVkW3JdCiAgICAgICAgciA8LSByICsgMQogICAgICAgIGludnMgPC0gaW52cyArIGxsZW4gLSBsICsgMQogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIHNvcnRlZFtpbmRleF0gPC1sZWZ0JHNvcnRlZFtsXQogICAgICAgIGwgPC0gbCArIDEKICAgICAgfQogICAgICBpbmRleCA8LSBpbmRleCArIDEKICAgIH0KICAgIHdoaWxlKGwgPD0gbGxlbil7c29ydGVkW2luZGV4XTwtbGVmdCRzb3J0ZWRbbF07aW5kZXg8LWluZGV4KzE7bDwtbCsxO30KICAgIHdoaWxlKHIgPD0gcmxlbil7c29ydGVkW2luZGV4XTwtcmlnaHQkc29ydGVkW3JdO2luZGV4PC1pbmRleCsxO3I8LXIrMTt9CiAgICBsaXN0KGludnMgPSBsZWZ0JGludnMgKyByaWdodCRpbnZzICsgaW52cywgc29ydGVkID0gc29ydGVkKQogIH0KfQoKYXJyYXkgPC0gcmVhZC50YWJsZSgiSW50ZWdlckFycmF5LnR4dCIpWywxXQpyZXN1bHQgPC0gbWVyZ2VJbnZDb3VudChhcnJheSkkaW52cw==