در این سوال، به پردازش درخت به صورت سطح به سطح و همراه با موازیکاری میپردازیم.
فایل [Source](https://quera.ir/contest/assignments/25979/download_problem_initial_project/87737/?noconvert=true) را دانلود کرده و محتوای آن را ببینید. شما باید متد `solve` از کلاس `Parallelism` را مطابق با توضیحات زیر پیادهسازی کنید.
شما باید پردازش این درخت را از پایینترین سطح (برگها) شروع کرده و به بالاترین سطح که ریشه درخت در آن قرار دارد برسید.
هر Node درخت، دارای سه ویژگی اندیس و پدر و تابع است.
+ اندیس (index): اندیس نود را تعیین میکند. نودهای موجود در هر سطح، یک اندیس یکتا دارند.
+ پدر (parent): نود پدر را تعیین میکند. برای نود ریشه مقدار آن null است.
+ تابع (func): تابع نود را تعیین میکند. **برای پردازش هر نود این تابع باید فراخوانی شود.**
پردازش درخت باید به این صورت باشد که:
1. نودهای هر سطح از درخت به صورت موازی و همزمان با هم پردازش شوند (متد `func`شان اجرا شود)
2. فقط زمانی که کار پردازش نودهای یک سطح تمام شد، پردازش نودهای سطح بالاتر میتواند آغاز شود.
3. در هر سطح از درخت، هر نود باید با یک ترد **همنام با اندیسش** پردازش شود.
## نکته
+ دقت کنید زمان اجرای تابع هر نود ممکن است زمانبر باشد.
+ زمان پردازش هر سطح حدودا به اندازه اجرای کندترین تابعِ مربوط به نودهای آن سطح، طول خواهد کشید.
## مثال
با اجرای متد `main` از کلاس `Main` خروجی زیر یکی خروجیهای صحیح محتمل است.
```
D1 by 1 - F1 by 1 - F2 by 2 - G1 by 1 - G2 by 2 - H1 by 1 -
```
درختی که در این مثال داده شده است، چنین ساختاری دارد:
```
.
└── H1
├── G1
├── G2
├── F1
├── D1
├── F2
```
توجه داشته باشید که تمامی `D`ها قبل از `F`ها و تمامی `F`ها قبل از `G`ها و تمامی `G`ها قبل از `H`ها چاپ شدهاند. همچنین هر نود توسط ترد همنام با اندیسش پردازش شده است.
# آنچه باید آپلود کنید
یک فایل زیپ آپلود کنید که در آن بسته ir.mci.parallel به صورت زیر وجود داشته باشد:
```
.
└── ir
└── mci
└── parallel
└── Parallelism.java
```
به صورتی که وقتی فایل زیپ را باز میکنیم، دقیقا شاخه ir را ببینیم که درون آن شاخه mci و درون آن نیز شاخه parallel قرار دارد. در داخل parallel فایل Parallelism.java باید قرار داشته باشد.