foldl
(fn
(e,
max) => Int
.max(e,
max)) (hd lst
) (tl lst
)
fun count_gaps lst=
case lst of
[] => 0
| [_] => 0
| head::neck::tail => (neck-head-1) + count_gaps(neck::tail)
fun insert_sorted(lst, vs) =
let fun insert_v(lst, v) =
case lst of
[] => [v]
| head::tail => if v<=head then v::head::tail else head::insert_v(tail, v)
in
case vs of
[] => lst
| h::t => insert_v(insert_sorted(lst, t), h)
end
fun filter_indexes f lst =
let fun help f lst c =
case lst of
[] => []
| h::t => if f(h) then c::(help f t (c+1)) else help f t (c+1)
in
help f lst 0
end
let
fun helper(n) =
case n of
0 => 0
| _
=> count_gaps
(filter_indexes
(fn e
=>e
>=n
) input) + helper
(n
-1) in
end
val c1 = compute [2,5,1,2,3,4,7,7,6] = 10
val c2 = compute [0,5,0,1,0,2,1,0] = 5
ZnVuIG1heCBsc3QgPSAKCWZvbGRsIChmbiAoZSwgbWF4KSA9PiBJbnQubWF4KGUsIG1heCkpIChoZCBsc3QpICh0bCBsc3QpCgpmdW4gY291bnRfZ2FwcyBsc3Q9CgljYXNlIGxzdCBvZgoJCVtdID0+IDAKCQl8IFtfXSA9PiAwCgkJfCBoZWFkOjpuZWNrOjp0YWlsID0+IChuZWNrLWhlYWQtMSkgKyBjb3VudF9nYXBzKG5lY2s6OnRhaWwpCgpmdW4gaW5zZXJ0X3NvcnRlZChsc3QsIHZzKSA9IAoJbGV0IGZ1biBpbnNlcnRfdihsc3QsIHYpID0KCQljYXNlIGxzdCBvZiAKCQkJW10gPT4gW3ZdCgkJCXwgaGVhZDo6dGFpbCA9PiBpZiB2PD1oZWFkIHRoZW4gdjo6aGVhZDo6dGFpbCBlbHNlIGhlYWQ6Omluc2VydF92KHRhaWwsIHYpCglpbgoJCWNhc2UgdnMgb2YKCQkJW10gPT4gbHN0CgkJCXwgaDo6dCA9PiBpbnNlcnRfdihpbnNlcnRfc29ydGVkKGxzdCwgdCksIGgpCgllbmQKCmZ1biBmaWx0ZXJfaW5kZXhlcyBmIGxzdCA9CglsZXQgZnVuIGhlbHAgZiBsc3QgYyA9IAoJCWNhc2UgbHN0IG9mCgkJCVtdID0+IFtdCgkJCXwgaDo6dCA9PiBpZiBmKGgpIHRoZW4gYzo6KGhlbHAgZiB0IChjKzEpKSBlbHNlIGhlbHAgZiB0IChjKzEpCglpbgoJCWhlbHAgZiBsc3QgMAoJZW5kCgpmdW4gY29tcHV0ZSBpbnB1dCA9IAoJbGV0IAoJCXZhbCBtYXggPSBtYXgoaW5wdXQpCgkJZnVuIGhlbHBlcihuKSA9CgkJCWNhc2UgbiBvZgoJCQkJMCA9PiAwCgkJCQl8IF8gPT4gY291bnRfZ2FwcyhmaWx0ZXJfaW5kZXhlcyAoZm4gZT0+ZT49bikgaW5wdXQpICsgaGVscGVyKG4tMSkKCWluCgkJaGVscGVyKG1heCkKCWVuZAoKdmFsIGMxID0gY29tcHV0ZSBbMiw1LDEsMiwzLDQsNyw3LDZdID0gMTAKdmFsIGMyID0gY29tcHV0ZSBbMCw1LDAsMSwwLDIsMSwwXSA9IDU=