module Main where type PID Int data Process Process PID Process derivi

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
module Main where
type PID = Int
data Process = Process PID [Process] deriving (Show)
decode :: [(PID, PID)] -> Process -> Process
decode [] p = p
decode ((el1, el2):tail) tree = if (hasProcess tree el2) -- если в нашем дереве уже есть родительский процесс
then decode tail (addToTree el1 el2 tree) -- добавляем новый процесс в список дочерних
else decode (tail ++ [(el1,el2)]) tree -- или добавляем процесс к дереву
--находит процесс с pid = root и добавляет в список его сыновей новый
addToTree :: PID -> PID -> Process -> Process
addToTree el1 root (Process pid arr) = if (pid == root)
then (Process pid ((Process el1 []):arr))
else Process pid (addToTreeArr el1 root arr)
addToTreeArr :: PID -> PID -> [Process] -> [Process]
addToTreeArr el1 root [] = []
addToTreeArr el1 root (x:xs) = (addToTree el1 root x) : (addToTreeArr el1 root xs)
--отвечает существует ли процесс с указанным пидом в дереве
hasProcess :: Process -> PID -> Bool
hasProcess (Process pid childs) proc = if (pid == proc)
then True
else (hasProcessArray childs proc)
hasProcessArray :: [Process] -> PID -> Bool
hasProcessArray [] pid = False
hasProcessArray (x:xs) pid = if (hasProcess x pid) then True
else hasProcessArray xs pid
inp = [(1, -1),(219, 214),(214, 1),(124,1)]
main = do (print(decode inp (Process (-1) [])))--(inp ++ [(0,0)]))
--main = print $ maxValsCnt [1,5,3,10,3,10,5] -- getMax [1, 5, 2, 3, 4] -- countHeight (Node (Val 1) (Node (Val 2) (Val 3)))
{-- newtype - работает быстрее чем data --}