lru::Int->Int->[Int]->[(Int,Int,Int,Int)]
lru m n p=(lru2 m n p 1 [] [])
lru2::Int->Int->[Int]->Int->[Int]->[Int]->[(Int,Int,Int,Int)]
lru2 _ _ [] _ _ _=[]
lru2 m n (p:rest) tijd werk times= (if ((length werk)<m && notElem p werk) then lru2 m n rest (tijd+1) (werk++[p]) (times++[tijd])
else (if elem p werk then lru2 m n rest (tijd+1) werk (change_time werk p times tijd)
else [(tijd,(index (minim times) times),werk!!(index (minim times) times),p)]++lru2 m n rest (tijd+1) (change_werk werk p (index (minim times) times)) (change_time (change_werk werk p (index (minim times) times)) p times tijd)))
change_time::[Int]->Int->[Int]->Int->[Int]
change_time werk p times tijd=take (index p werk) times++[tijd]++drop ((index p werk)+1) times
change_werk::[Int]->Int->Int->[Int]
change_werk werk p ind=take ind werk++[p]++drop (ind+1) werk
index::Int->[Int]->Int
index _ []=error "not in list"
index p (el:rest)=(if p==el then 0
else (1+index p rest))
minim :: (Ord a) => [a] -> a
minim [] = error "empty list"
minim xs = foldl1 min xs