+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
«تانوس» به دنبال ۶ سنگ بینهایت میگردد تا با آنها بازی کند. (اگر فیلمهای [**Avengers**](https://www.marvel.com/movies/avengers-endgame) را دیده باشید کاملاً در جریان هستید.)
![تانوس خوشحال](https://quera.org/qbox/view/NAfxEsaZyh/A.jpg)
هر کدام از این ۶ سنگ یک نام و یک رنگ دارند. سنگ فضا (`space`) به رنگ آبی (`blue`)، سنگ ذهن (`mind`) به رنگ زرد (`yellow`)، سنگ واقعیت (`reality`) به رنگ قرمز (`red`)، سنگ قدرت (`power`) به رنگ بنفش (`purple`)، سنگ زمان (`time`) به رنگ سبز (`green`) و سنگ روح (`soul`) به رنگ نارنجی (`orange`) است.
اما «تانوس» کوررنگی دارد و از شما میخواهد که با دریافت نام هر سنگ، رنگ آن را به او بگویید.
# ورودی
در تنها سطر ورودی یک رشته از حروف کوچک انگلیسی آمده که نام یکی از ۶ سنگ بینهایت است.
# خروجی
در تنها سطر خروجی یک رشته از حروف کوچک انگلیسی چاپ کنید که رنگ سنگ ورودی داده شده را چاپ میکند.
# مثالها
## ورودی نمونه ۱
```
time
```
## خروجی نمونه ۱
```
green
```
سنگ زمان به رنگ سبز است.
## ورودی نمونه ۲
```
power
```
## خروجی نمونه ۲
```
purple
```
سنگ قدرت به رنگ بنفش است.
<details class="red">
<summary>
**اشتباهات متداول**
</summary>
<details class="red">
<summary>
**چک کردن شرایط ورودی مسئله**
</summary>
نیازی نیست چک کنید شرایط گفته شده در ورودی برقرار است یا نه. توضیحات محدودیتها فقط برای آگاهی شما دربارهی تستها و محدودیتهای مسئله است و قطعاً در ورودیهای داده شده به برنامهی شما رعایت میشوند. پس نیازی نیست بنویسید:
```python
if 1 <= n <= 100:
# answer of problem
else:
# print('invalid input')
```
</details>
<details class="red">
<summary>
**ابتدا همهی ورودی را گرفتن و در نهایت همهی خروجی را چاپ کردن**
</summary>
شما میتوانید لابهلای دریافت ورودی، خروجی دهید. پس نیازی نیست ابتدا همهی ورودیها را دریافت کنید و در نهایت همهی خروجیها را چاپ کنید. مخصوصاً برای سوالاتی که باید به چندین سوال پاسخ دهید، میتوانید دو قسمت ورودی و خروجی را کاملاً مستقل در نظر بگیرید و مطمئن باشید تداخلی پیش نمیآید.
</details>
<details class="red">
<summary>
**چاپ کردن موارد اضافه برای دریافت ورودی**
</summary>
لطفاً از چاپ کردن موارد اضافه مثل `please enter a number` برای دریافت ورودی پرهیز کنید. برای مثال در زبان پایتون نباید بنویسید:
```python
input('please enter:')
```
</details>
<details class="red">
<summary>
**چند فایلی کد زدن**
</summary>
برای زبانهایی مثل جاوا نباید در بالای کد شما آدرس پکیج داده شود. برای مثال در بالای کد خود نباید بنویسید:
```java
package ir.quera.contest;
```
</details>
<details class="red">
<summary>
**استفاده از چند `Scanner` برای دریافت ورودی**
</summary>
در زبان جاوا، باید فقط یک شئ از جنس `Scanner` تعریف کنید و همهی ورودیها را با آن دریافت کنید.
</details>
</details>
شش سنگ
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
امین در خواب میبیند که به ارتفاعات یک میلیون کیلومتری از سطح دریا قرار دارد و تصمیم میگیرد که $n$ دقیقه به راه خود ادامه دهد. پس از راه افتادن، در دقیقهی $i$ام به ارتفاع $h_i$ میرسد، اما متاسفانه مقدار $h_i$ را نمیداند و تنها اطلاعاتی که میتواند محاسبه کند، اختلاف ارتفاعش نسبت به دقیقهی قبل است؛ یعنی $d_i = |h_i - h_{i - 1}|\,$ را میداند که $d_i$ها نیز تنها اعداد صحیح ۰، ۱ یا ۲ هستند.
او که در مکان اولیهاش یک قصر خیالی ساخته بود، میخواهد در پایان کوهنوردی در نزدیکترین مکان ممکن به قصرش متوقف شود.
امین از شما میخواهد با استفاده از مقادیر $d_1, d_2, \dots, d_n\,$، به او بگویید پس از حرکتهای به سمت بالا یا پایین به اندازهی $d_i$، در پایان، کمترین فاصلهی ممکن از قصر چقدر است؟
# ورودی
در سطر اول ورودی، عدد صحیح و مثبت $n$ آمده است.
$$1 \leq n \leq 100 \, 000$$
در سطر دوم ورودی، $n$ عدد صحیح و مثبت $d_1, d_2, \dots, d_n\,$ که با یک فاصله از هم جدا شدهاند، آمده است.
$$\forall i = 1, 2, \dots, n; \quad d_i \in \{0, 1, 2\}$$
# خروجی
در تنها سطر خروجی، کمترین فاصله ممکن از قصر خیالی امین را چاپ کنید.
# مثال
## ورودی نمونه ۱
```
5
1 2 1 0 2
```
## خروجی نمونه ۱
```
0
```
اگر به این ترتیب عمل کرده باشد:
+ در دقیقهی ۰ تا ۱، ۱ متر بالا برود و ارتفاعش نسبت به شروع ۱ واحد زیاد شود.
+ در دقیقهی ۱ تا ۲، ۲ متر بالا برود و ارتفاعش نسبت به شروع ۳ واحد زیاد میشود.
+ در دقیقهی ۲ تا ۳، ۱ متر پایین برود و ارتفاعش نسبت به شروع ۲ واحد زیاد میشود.
+ در دقیقهی ۳ تا ۴، ۰ متر بالا/پایین برود و ارتفاعش نسبت به شروع ۲ واحد زیاد میشود.
+ در دقیقهی ۴ تا ۵، ۲ متر پایین برود و ارتفاعش نسبت به شروع ۰ واحد زیاد میشود.
در پایان فاصلهی امین از قصر ۰ بوده و واضح است که این عدد از ۰ کمتر نمیشود.
## ورودی نمونه ۲
```
3
1 1 1
```
## خروجی نمونه ۲
```
1
```
اطلاعات کوهنوردی
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
امین از تجربهی کوهنوردی قبلی یک نقشه بهدست آورده است. در نقشهی او $n$ کوه، کنار هم و در یک ردیف قرار داشتند به طوری که ارتفاع هیچ دو کوه مجاوری یکسان نبود. او به یک زیردنباله (نه لزوماً متوالی) از کوهها، یک رشتهکوه میگوید اگر هر کوه (به جز دو کوه اول و آخر) از هر دو کوه مجاورش، یا کوتاهتر باشد یا بلندتر.
حال از شما $q$ سوال مختلف پرسیده میشود. در هر سوال یک بازهی $l$ و $r$ داده میشود و از شما میپرسیم بلندترین زیردنبالهای که رشتهکوه باشد در بازهی $l$ تا $r$ چقدر است؟
# ورودی
در سطر اول ورودی، عدد صحیح و مثبت $n$ که نشان دهندهی تعداد کوههاست، داده میشود.
$$1 \leq n \leq 100 \, 000$$
در سطر دوم ورودی، $n$ عدد صحیح و نامنفی $a_1, a_2, \dots, a_n\,$ داده میشود که با فاصله از هم جدا شدهاند و عدد $i$ام ارتفاع کوه $i$ام را نشان میدهد.
$$0 \leq a_i \leq 10^9$$
در سطر سوم ورودی، عدد صحیح و مثبت $q$ داده میشود که نشان دهندهی تعداد سوالات است.
$$1 \leq q \leq 100 \, 000$$
در $q$ سطر بعدی، در هر سطر دو عدد صحیح $l$ و $r$ که با یک فاصله از هم جدا شدهاند داده میشود و بازهی مورد سوال را نشان میدهد.
# خروجی
برای هر سوال، طول بزرگترین زیردنباله از کوهها که تشکیل رشتهکوه میدهند را چاپ کنید.
# زیرمسئلهها
| زیرمسئله | نمره | محدودیت |
|:------------------:|:----------:|:------------------:|
| ۱ | ۲۵ | $n, q \leq 100$ |
| ۲ | ۵۰ | $nq \leq 1000 \,000$ |
| ۳ | ۵۰ | بدون محدودیت اضافه |
# مثالها
## ورودی نمونه ۱
```
5
1 4 6 3 5
3
1 5
2 4
1 3
```
## خروجی نمونه ۱
```
4
3
2
```
+ در بازهی ۱ تا ۵ یعنی کل اعداد و بزرگترین رشتهکوه از حذف کوه دوم بدست میآید.
+ در بازهی ۲ تا ۴ همهی کوهها رشتهکوه هستند.
+ در بازهی ۱ تا ۳ یک رشته کوه به اندازهی دو از حذف کوه دوم بدست میآید.
رشتهکوه شناسی
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
به تازگی یک نمایشگر برای افراد نابینا با همان روش خط بریل اختراع شده که روی آن ۶ برجستگی بهصورت شکل زیر دارد و بهصورت اتوماتیک بالا یا پایین بودن برجستگیهایش تنظیم میشود و میتواند کاراکترهای مختلف را نمایش دهد. این نمایشگر برای بالا یا پایین بردن هر برجستگی ۱ واحد انرژی مصرف میکند.
![](https://lh7-us.googleusercontent.com/zYdCpHhWKUnUAVWhd4cVCRsPu6oK9ei7YKoqia6CSnCRmC2w6YPYqo_3fNx8JPJn-CSgVwY7wH59XEYDkUjPl00EvgUHSMhOzx7txexd3Y0crdMLSz-eyToPxW9vPexc_rIaDzoEPhCSh2C_IR2u8hU)
حال یک تابلو داریم که روی آن ۱۵تا از این نمایشگرها قرار گرفته است و با کمک آن اعداد ۱ تا ۱۵ رقمی را میتوانیم نمایش دهیم. توجه کنید مثلاً هنگام نمایش اعداد ۲ رقمی، ۱۳ رقم دیگر همگی هم سطح با تابلو هستند و هیچ برجستگی ندارند و این طور نیست که عدد ۰ را نشان دهند. به این وضعیت از نمایشگر «خاموش» میگوییم.
![](https://lh7-us.googleusercontent.com/NEWQE9hY95cq5asDECRLqGU6cFveahymd8LRm2x7AEIcWLiep1CUjvzBvox9Yi4dXKfqruOr3BjBPXYY4YVrgpGxVz1WEvMYXszoYZTc3rBJR9b2iIkQXt4m3JOUZiHYFuZqoUhwiQnYxa8t26cP4RU)
ابتدا نمایشگرها همگی خاموش هستند سپس این تابلو عدد $a$ را نشان میدهد، سپس به $a+1$ تغییر میکند و همینطور ادامه میدهد تا عدد $b$ را نشان دهد و در نهایت کل تابلو خاموش میشود. حال از شما میخواهیم برنامهای بنویسید که محاسبه کند مجموع انرژی مصرف شده برای کل این فرآیند چقدر است؟
# ورودی
ورودی شامل $t$ سناریو است.
$$1 \leq t \leq 10\,000$$
در تنها سطر هر سناریو دو عدد صحیح و نامنفی $a$ و $b$ که با یک فاصله از هم جدا شدهاند آمده و عدد شروع و پایان بازهی نمایش تابلو را نشان میدهد.
$$1 \leq a \leq b < 10^{15}$$
# خروجی
خروجی $t$ سطر دارد و در هر سطر، هزینهی نمایش اعداد بازهی $[a, b]$ را چاپ کنید.
# زیرمسئلهها
| زیرمسئله | نمره | محدودیت |
|:------------------:|:----------:|:------------------:|
| ۱ | ۷۰ | $\sum \|b - a\| \leq 100 \, 000$ |
| ۲ | ۱۰۵ | بدون محدودیت اضافه |
# مثال
## ورودی نمونه ۱
```
3
3 5
102 102
8 12
```
## خروجی نمونه ۱
```
6
12
16
```
سناریو اول:
+ ابتدا خاموش است و سپس عدد ۳ روشن میشود. پس ۲ چراغ روشن میشود.
+ سپس عدد ۳ به ۴ تغییر میکند و در این فرآیند ۱ چراغ روشن میشود.
+ سپس عدد ۴ به ۵ تغییر میکند و در این فرآیند ۱ چراغ خاموش میشود.
+ سپس عدد ۵ خاموش میشود و در این فرآیند ۲ چراغ خاموش میشود.
سناریو دوم:
+ ابتدا همه تابلوها خاموش است و تابلو اول عدد ۲ را نمایش میدهد، (۲ چراغ) تابلو دوم عدد ۰ را نمایش میدهد (۳ چراغ) و تابلو سوم عدد ۱ را نمایش میدهد. (۱ چراغ) پس در مجموع ۶ چراغ روشن میشود.
+ به همین صورت همه ۶ چراغ خاموش میشود.
سناریو سوم:
+ ابتدا خاموش است و سپس عدد ۸ روشن میشود. پس ۳ چراغ روشن میشود.
+ سپس عدد ۸ به ۹ تغییر میکند و در این فرآیند ۳ چراغ تغییر میکند.
+ سپس عدد ۹ به ۱۰ تغییر میکند و در این فرآیند ۲ چراغ تغییر میکند (تابلو دوم از حالت خاموش به عدد ۱ تغییر میکند و تابلو اول از عدد ۹ به ۰ تغییر میکند.).
+ سپس عدد ۱۰ به ۱۱ تغییر میکند و در این فرآیند ۴ چراغ تغییر میکند.
+ سپس عدد ۱۱ به ۱۲ تغییر میکند و در این فرآیند ۱ چراغ تغییر میکند.
+ سپس عدد ۱۲ خاموش میشود و در این فرآیند ۳ چراغ خاموش میشود.
نمایشگر بریل
**کد شما باید روی PostgreSQL قابل اجرا باشد.**
----------
در این سوال، بخشی از پایگاه داده مربوط به اطلاعات پرواز کشور روسیه در اختیار شما قرار گرفته است.
# جزئیات دیتابیس
دادههای اولیه برای **تست نهایی** را از [این لینک](/contest/assignments/60605/download_problem_initial_project/210972/) دانلود کنید.
<details class="yellow">
<summary>
**توضیحات در مورد دادههای اولیه**
</summary>
در فایل `Travel.zip` فایلی به اسم `initial.sql` وجود دارد.
با اجرای این فایل، همهی جداول و سطرهایی که برای **تست نهایی** مورد استفاده قرار میگیرد در پایگاه داده شما ایجاد میشود. پیش از اجرای این فایل، حتما پایگاه داده با اسم دلخواه ایجاد کنید و در ابتدای این فایل، کد `use YOUR_DB_NAME;` را وارد کنید.
</details>
<details class="grey">
<summary>
**توضیحات جداول دیتابیس**
</summary>
ساختار جداول بهشرح زیر است:
**جدول `aircraft_data`**: از این جدول برای نگهداری اطلاعات هواپیماها استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------:|:---:|:----:|
|`aircraft_code`|`character varying(8)`|کد هواپیما|
|`model`|`character varying(64)`|مدل هواپیما|
|`range`|`integer`|برد هواپیما|
**جدول `airports_data`**: از این جدول برای نگهداری اطلاعات فرودگاهها استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------:|:--:|:----:|
|`airport_code`|`character varying(4)`|کد فرودگاه|
|`airport_name`|`json`|نام فرودگاه با فرمت JSON|
|`city`|`json`|شهری که فرودگاه در آن قرار دارد با فرمت JSON|
|`timezone`|`character varying(32)`|منطقه زمانی فرودگاه|
**جدول `boarding_passes`**: از این جدول برای نگهداری اطلاعات کارتهای پرواز استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------:|:--:|:----:|
|`ticket_no`|`character varying(8)`|شماره بلیط|
|`flight_id`|`integer`|شناسه پرواز|
|`boarding_no`|`integer`|شماره کارت پرواز|
|`seat_no`|`character varying(4)`|شماره صندلی|
**جدول `flights`**: از این جدول برای نگهداری اطلاعات پروازها استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------:|:--:|:----:|
|`flight_id`|`integer`|شناسه پرواز|
|`flight_no`|`character varying(8)`|شماره پرواز|
|`scheduled_departure`|`character varying(32)`|زمان حرکت برنامه ریزی شده|
|`scheduled_arrival`|`character varying(32)`|زمان ورود برنامه ریزی شده|
|`departure_airport`|`character varying(4)`|کد فرودگاه مبدا|
|`arrival_airport`|`character varying(4)`|کد فرودگاه مقصد|
|`status`|`character varying(16)`|وضعیت پرواز|
|`aircraft_code`|`character varying(4)`|کد هواپیما|
**جدول `seats`**: از این جدول برای نگهداری اطلاعات صندلیها استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------:|:--:|:----:|
|`aircraft_code`|`character varying(4)`|کد هواپیما|
|`seat_no`|`character varying(4)`|شماره صندلی|
|`fare_conditions`|`character varying(8)`|کلاس صندلی هواپیما|
**جدول `ticket_flights`**: از این جدول برای نگهداری اطلاعات بلیطهای هر پرواز استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------:|:--:|:----:|
|`ticket_no`|`character varying(16)`|شماره بلیط|
|`flight_id`|`integer`|شناسه پرواز|
|`fare_conditions`|`character varying(8) `|کلاس بلیط هواپیما|
|`amount`|`integer`|مبلغ بلیط|
**جدول `tickets`**: از این جدول برای نگهداری اطلاعات بلیطها استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------:|:--:|:----:|
|`ticket_no`|`character varying(16)`|شماره بلیط|
|`book_ref`|`character varying(8)`|کد مرجع رزرو|
|`passenger_id`|`character varying(16)`|شناسه مشتری|
</details>
# مطلوبات
۱. تعداد صندلیهای هر هواپیما به تفکیک کلاس آنها
<details class="blue">
<summary>
*توضیحات مربوط به کوئری اول*
</summary>
خروجی این کوئری شامل سه ستون با نامهای `aircraft_code` و `fare_conditions` و `count` است که به ترتیب کد هواپیما، نوع کلاس صندلی و تعداد صندلیهای موجود در هواپیمای مذکور با کلاس مشخص شده است. در نهایت جدول، باید بر اساس ستون `aircraft_code` به صورت صعودی و سپس براساس `count` به صورت نزولی مرتب شود و در صورت برابر بودن این دو ستون بر اساس ستون `fare_conditions` به صورت صعودی مرتب شود.
۴ سطر اول خروجی شما باید به شکل زیر باشد:
| aircraft_code| fare_conditions| count|
|:---:|:---:|:---:|
| 319 | Economy | 96 |
| 319 | Business | 20 |
| 320 | Economy | 120 |
| 320 | Business | 20 |
</details>
۲. مجموع تعداد پروازهای کنسل شده در روزهای مختلف هفته
</details>
<details class="blue">
<summary>
*توضیحات مربوط به کوئری دوم*
</summary>
خروجی این جدول شامل دو ستون با نامهای `day` و `count` است که به ترتیب شامل روزهای هفته و تعداد پروازهای کنسل شده در آن روز هستند. جدول نهایی باید بر اساس ستون `count` به صورت نزولی و سپس بر اساس ستون `day` به صورت صعودی مرتب شود.
۲ سطر اول خروجی شما باید به شکل زیر باشد
| day | count |
|:---:|:---:|
| Wednesday | 2 |
| Thursday | 1 |
</details>
۳. رتبهبندی تعداد مسافر جابهجا شده در فرودگاهها توسط هواپیماهای مختلف
<details class="blue">
<summary>
*توضیحات مربوط به کوئری سوم*
</summary>
جدول خروجی شامل چهار ستون با نامهای `airport` و `aircraft_model` و `count`
و `rank` است که به ترتیب شامل نام فرودگاه، مدل هواپیما، تعداد مسافرانی که توسط این هواپیما یا به این فرودگاه آمدند یا از این فرودگاه رفتند ( **طبیعتا پروازهای کنسل شده نباید حساب شوند**)، است و رتبه این هواپیما در بین تمام هواپیماها که در این فرودگاه تردد کردند. دقت کنید که رتبهبندی بر اساس تعداد دفعات تردد (ستون `count`) به این صورت محاسبه میشود که اگر دو هواپیما با بیشترین `count`، یکسان بودند هردو رتبه یک میشوند و هواپیما بعدی رتبهاش دو میشود. جدول نهایی، باید به ترتیب بر اساس ستونهای `airport` و `rank` و `aircraft_model` به صورت صعودی مرتب باشد.
**توجه ۱: لازم به ذکر است برای نام شهرها، باید از نام انگلیسی که در JSON مربوطه وجود دارد، استفاده کنید.**
۴ سطر اول خروجی شما باید به شکل زیر باشد.
| airport | aircraft_model | count | rank |
|:---:|:---:|:---:|:---:|
| Abakan Airport | Cessna 208 Caravan | 435 | 1 |
| Abakan Airport | Airbus A319-100 | 405 | 2 |
| Anapa Vityazevo Airport | Boeing 737-300 | 2765 | 1 |
| Anapa Vityazevo Airport | Sukhoi Superjet-100 | 2017 | 2 |
</details>
۴. فاصله زمانی شهرهای مختلف
<details class="blue">
<summary>
*توضیحات مربوط به کوئری چهارم*
</summary>
جدول خروجی شامل سه ستون با نامهای `city1` و `city2` و `time_dist` است که به ترتیب شهرهای دو سر مسیر و فاصله زمانی شهرهاست. جدول نهایی باید بر اساس ستون `time_dist` به صورت نزولی و سپس بر اساس `city1` و `city2` به صورت صعودی مرتب باشد. توجه کنید که هر زوج شهر باید یک بار تکرار شود و همچنین از لحاظ ترتیب الفبایی باید`city1` نسبت به `city2` مقدم باشد.
**توجه: فاصله زمانی شهرها برابر است با میانگین فاصله زمانی بین فرودگاههای آن دو شهر و فاصله زمانی دو فرودگاه برابر است با میانگین اختلاف زمان حرکت و ورود برنامهریزی شده در بلیطهای مختلفی که برای این دو فرودگاه وجود دارد (دقت کنید که بلیطهای کنسل شده هم باید حساب شوند):**
$$ time\ distance(c_1, c_2) = Average_{a_1\in c_1, a_2\in c_2}\ \{time\ distance(a_1, a_2)\} $$
$$ time\ distance(a_1, a_2) = Average_{f\in flights}\ \{f.scheduled\_arrival - f.scheduled\_departure\} $$
۳ سطر اول خروجی شما باید به شکل زیر باشد.
| city1 | city2 | time_dist |
|:---:|:---:|:---:|
| Moscow | Petropavlovsk | 530 |
| Moscow | Yuzhno-Sakhalinsk | 527.5 |
| Magadan | Mineralnye Vody | 525 |
</details>
# روش پیادهسازی
در یک فایل با نام `code.sql` کد خود را قرار دهید و آن را فشرده (`zip` ) کنید و در سایت بارگذاری نمایید.
کد شما باید به صورت زیر باشد(نام فایل zip مهم نیست).
```sql
-- Section1
Your first query here
-- Section2
Your second query here
-- Section3
Your third query here
-- Section4
Your fourth query here
```
پروازهای روسیه - SQL
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
# توضیحات اولیه پروژه
میخواهیم یک سامانه برای پیشنهاد موقعیت کار به کارجوها طراحی کنیم. این سامانه باید بتواند اطلاعات آنها را دریافت کند و برای هر کارجو مناسبترین کار را پیشنهاد دهد. همچنین این سیستم با توجه به بازدیدهایی که کارجوها از موقعیتهای کاری میکنند تغییر میکند.
تعدادی موقعیت کار داریم و هر موقعیت کار دارای ویژگیهای «نام موقعیت کار»، «بازهی سنی مورد نیاز این کار»، «وضعیت ساعتکاری (تماموقت / پارهوقت / پروژهای)»، «حقوق پیشنهادی» و «مهارتهای مورد نیاز برای این موقعیت کاری»
همچنین هر کارجو ویژگیهای «نام کارجو»، «سن کارجو»، «وضعیت ساعتکاری (تماموقت / پارهوقت / پروژهای)»، «حقوق مورد انتظار کارجو» و «مهارتهای این کارجو» را دارد.
# دستورها
به شما یک لیست از تمام مهارتهای موجود داده میشود و از شما میخواهیم تعدادی کوئری را پیادهسازی کنید:
## فاز اول
<details class="green">
<summary>
**اضافه کردن موقعیت کار (`ADD-JOB`)**
</summary>
----------
```
ADD-JOB <NAME> <MINAGE> <MAXAGE> <FULLTIME|PARTTIME|PROJECT> <SALARY>
```
در این کوئری از شما خواسته میشود یک موقعیت کاری را به سامانه اضافه کنید. اطلاعاتی که در این کوئری داده میشود شامل نام موقعیت شغلی (`<NAME>`)، محدودیت بازهی سنی کارجو (`<MINAGE>` و `<MAXAGE>`)، شرایط زمانی کار (یکی از سه حالت `<FULLTIME|PARTTIME|PROJECT>`) و میزان حقوق ماهانه (`<SALARY>`) است.
+ رشتهی `<NAME>` باید فقط شامل حروف کوچک و بزرگ انگلیسی با طولی بین ۱ تا ۱۰ کاراکتر باشد، در غیر این صورت خطای `invalid name` را چاپ کنید.
+ دو مقدار `<MINAGE>` و `<MAXAGE>` باید بین ۰ تا ۲۰۰ (شامل ابتدا و انتها) باشند. همچنین باید `<MINAGE>` از `<MAXAGE>` کمتر یا مساوی باشد، در غیر این صورت خطای `invalid age interval` را چاپ کنید. دقت کنید لزومی ندارد این مقادیر صحیح باشند.
+ شرایط زمانی باید دقیقاً یکی از سه کلمهی `FULLTIME` ،`PARTTIME` یا `PROJECT` باشد (به بزرگی حروف دقت کنید) و در غیر این صورت خطای `invalid timetype` را چاپ کنید.
+ مقدار حقوق باید نامنفی و کمتر از ۱،۰۰۰،۰۰۰،۰۰۰ بوده و سه رقم سمت راست آن باید ۰ باشد، در غیر این صورت پیام `invalid salary` را چاپ کنید.
+ اگر هیچکدام از خطاهای بالا پیش نیامد، پیام `job id is <idx>` را چاپ کنید و بهجای `<idx>` شمارهی موقعیت کار را قرار دهید. برای شمارهگذاری باید از ۱ شروع کرده و یکی یکی زیاد کنید. فقط به موقعیتهای کاری که به این مرحله میرسند و با موفقیت ثبت میشوند، شماره نسبت دهید.
</details>
<details class="green">
<summary>
**اضافه کردن کارجو (`ADD-USER`)**
</summary>
```
ADD-USER <NAME> <AGE> <FULLTIME|PARTTIME|PROJECT> <SALARY>
```
----------
در این کوئری شما باید یک کارجو را به سامانه بیفزایید. اطلاعات کارجو شامل نام (`<NAME>`)، سن (`<AGE>`)، شرایط زمانی کارجو برای کار (یکی از سه حالت `<FULLTIME|PARTTIME|PROJECT>`) و حقوق درخواستی ماهانه (`<SALARY>`) به شما داده میشود.
+ رشتهی `<NAME>` باید فقط شامل حروف کوچک و بزرگ انگلیسی با طولی بین ۱ تا ۱۰ کاراکتر باشد. در غیر این صورت خطای `invalid name` را چاپ کنید.
+ مقدار `<AGE>` باید بین ۰ تا ۲۰۰ (شامل ابتدا و انتها) باشد، در غیر این صورت خطای `invalid age` را چاپ کنید. دقت کنید لزومی ندارد این مقدار صحیح باشد.
+ شرایط زمانی باید دقیقاً یکی از سه کلمهی `FULLTIME`، `PARTTIME` یا `PROJECT` باشد (به بزرگی حروف دقت کنید) و در غیر این صورت خطای `invalid timetype` را چاپ کنید.
+ مقدار حقوق باید نامنفی و کمتر از ۱،۰۰۰،۰۰۰،۰۰۰ بوده و سه رقم سمت راست آن باید ۰ باشد، در غیر این صورت پیام `invalid salary` را چاپ کنید.
+ اگر هیچ کدام از خطاهای بالا پیش نیامد، پیام `user id is <idx>` را چاپ کنید و بهجای `<idx>` شمارهی کارجو را قرار دهید. برای شمارهگذاری باید از ۱ شروع کرده و یکی یکی زیاد کنید. فقط به کارجوهایی که به این مرحله میرسند و با موفقیت ثبت میشوند، شماره نسبت دهید.
</details>
<details class="green">
<summary>
**اضافه کردن مهارت به موقعیت کاری (`ADD-JOB-SKILL`)**
</summary>
----------
```
ADD-JOB-SKILL <JOB-ID> <SKILL>
```
در این کوئری از شما خواسته میشود تا یک مهارت لازم را به یک کار موجود در لیست کارها اضافه نمایید. به موارد زیر توجه کنید:
+ اگر موقعیت کاری با شمارهی `<JOB-ID>` وجود ندارد، خطای `invalid index` را چاپ کنید. تضمین میشود ID دادهشده، عددی صحیح باشد.
+ اگر مهارتی با نام `<SKILL>` در لیست اولیه وجود ندارد، خطای `invalid skill` را چاپ کنید.
+ اگر این مهارت قبلاً به این موقعیت کاری اضافه شده، پیام `repeated skill` را چاپ کنید.
+ اگر هیچکدام از خطاهای بالا رخ نداد، پیام `skill added` را چاپ کنید.
</details>
<details class="green">
<summary>
**اضافه کردن مهارت به کارجو (`ADD-USER-SKILL`)**
</summary>
----------
```
ADD-USER-SKILL <USER-ID> <SKILL>
```
در این کوئری از شما خواسته میشود تا یک مهارت را به مهارتهای کارجویی که از پیش ثبتنام کرده، اضافه نمایید. به موارد زیر توجه کنید:
+ اگر کارجویی با شمارهی `<USER-ID>` وجود ندارد، خطای `invalid index` را چاپ کنید. تضمین میشود ID دادهشده، عددی صحیح باشد.
+ اگر مهارتی با نام `<SKILL>` در لیست اولیه وجود ندارد، خطای `invalid skill` را چاپ کنید.
+ اگر این مهارت قبلاً به این کاربر اضافه شده، پیام `repeated skill` را چاپ کنید.
+ اگر هیچکدام از خطاهای بالا رخ نداد، پیام `skill added` را چاپ کنید.
</details>
## فاز دوم
<details class="green">
<summary>
**گزارش مشاهده (`VIEW`)**
</summary>
----------
```
VIEW <USER-ID> <JOB-ID>
```
این دستور یعنی کارجو یک موقعیت کاری را مشاهده کرده است.
+ اگر کارجویی با شمارهی `<USER-ID>` یا موقعیت کاری با شمارهی `<JOB-ID>` وجود نداشت، خطای `invalid index` را چاپ کنید. تضمین میشود IDهای دادهشده، اعدادی صحیح باشد.
+ در صورتی که خطایی پیش نیامد، پیام `tracked` را چاپ کنید.
</details>
<details class="green">
<summary>
**وضعیت موقعیت کار (`JOB-STATUS`)**
</summary>
----------
```
JOB-STATUS <JOB-ID>
```
+ اگر موقعیت کاری با شمارهی `<JOB-ID>` وجود ندارد، خطای `invalid index` را چاپ کنید. تضمین میشود ID دادهشده، عددی صحیح باشد.
+ در غیر این صورت نام موقعیت کاری، سپس با یک `-`، مجموع تعداد `view`هایی که این موقعیت کاری داشته و سپس یک `-` و برای همهی مهارتهایی که در این موقعیت کاری هست در یک `(,)` ابتدا نام مهارت و سپس تعداد `view`هایی کارجوها با این مهارت داشتند را به صورت صعودی بر اساس این تعداد چاپ کنید.
</details>
<details class="green">
<summary>
**وضعیت کارجو (`USER-STATUS`)**
</summary>
----------
```
USER-STATUS <USER-ID>
```
در این دستور، باید مهارتها را به ترتیب نشان دهید. دقت کنید ترتیب مهارتها، بر اساس مشاهدات کارجو تغییر میکند.
+ اگر کارجویی با شمارهی `<USER-ID>` وجود ندارد، خطای `invalid index` را چاپ کنید. تضمین میشود ID دادهشده، عددی صحیح باشد.
+ در غیر این صورت نام کارجو، سپس با یک `-` و برای همهی مهارتهایی که در این کارجو هست در یک `(,)` ابتدا نام مهارت و سپس تعداد `view`هایی برای موقعیتهای کاری با این مهارت داشتند را به صورت صعودی بر اساس این تعداد چاپ کنید.
</details>
## فاز سوم
<details class="green">
<summary>
**دریافت لیست کارها (`GET-JOBLIST`)**
</summary>
----------
```
GET-JOBLIST <USER-ID>
```
در این بخش باید مهارتهای مورد نیاز شغلها را با مهارتهای کارجو مقایسه کرده و طبق تابع داده شده در ادامه، امتیاز آنها را محاسبه کنید. سپس بر اساس امتیاز آنها را مرتب کرده و ۵ موقعیت شغلی برتر را با امتیازشان چاپ کنید.
</details>
## متناسب بودن کارجو با موقعیت کار
امتیاز متناسب بودن یک کارجو و موقعیت کار از بخشهای زیر بهدست میآید.
<details class="blue">
<summary>
**امتیاز سن**
</summary>
----------
اگر سن کارجو $x$ و بازهی سنی مورد نیاز موقعیت کار $[l, r]$ باشد، امتیاز برابر است با:
$$
\begin{cases}
\min\{r - x, x - l\} & l \leq x \leq r \\
x - l & x \lt l \\
r - x & x \gt r \\
\end{cases}
$$
</details>
<details class="blue">
<summary>
**امتیاز مهارتها**
</summary>
اگر مجموعهی مهارتهای کارجو $A$ و مجموعهی مهارتهای مورد نیاز موقعیت کار $B$ باشد، امتیاز برابر است با:
$$3 \times |A \cap B| - |B - A|$$
</details>
<details class="blue">
<summary>
**امتیاز وضعیت زمان**
</summary>
----------
از روی این جدول امتیاز را تشخیص دهید:
| . | `FULLTIME` | `PARTTIME` | `PROJECT` |
|:---:|:----:|:---:|:---:|
| **`FULLTIME`** | ۱۰ | ۵ | ۴ |
| **`PARTTIME`** | ۵ | ۱۰ | ۵ |
| **`PROJECT`** | ۴ | ۵ | ۱۰ |
</details>
<details class="blue">
<summary>
**امتیاز حقوق**
</summary>
----------
اگر حقوق مورد انتظار کارجو $x$ و حقوق پیشنهادی موقعیت کار $y$ باشد، امتیاز این قسمت برابر است با:
$$\lfloor\frac{1000}{\max\{|x - y|, 1\}}\rfloor$$
</details>
اگر مجموع امتیازها چهار عدد قبل برابر $s$ شود، امتیاز هر کاربر $s \times 1000$ بهعلاوهی شمارهی موقعیت کاری است.
</details>
# نکات
+ همهی عبارتهای داخل `<>` یک رشته به طول حداقل ۱ و حداکثر ۱۰ از کاراکترهای رقم، حروف بزرگ و کوچک و `.` است.
+ اگر چند خطا از خطاهای بالا پیش آمد، تنها خطایی را چاپ کنید که زودتر آمده است.
# زیرمسئلهها
|زیرمسئله | نمره | محدودیت |
|:---:|:---:|:---:|
| ۱ | ۱۰۰ | فاز اول |
| ۲ | ۱۰۰ | فاز دوم |
| ۲ | ۱۰۰ | فاز سوم |
# ورودی
در سطر اول ورودی، عدد صحیح و مثبت $s$ آمده است که تعداد مهارتها را نشان میدهد.
$$1 \leq s \leq 100$$
در سطر دوم ورودی، یک لیست شامل $s$ رشته متمایز که با یک فاصله از هم جدا شدهاند آمده است که لیست مهارتها را نشان میدهد. در سطر سوم ورودی، عدد صحیح و مثبت $q$ آمده که تعداد درخواستهایی را که باید پوشش دهید، نشان میدهد.
$$1 \leq q \leq 1000$$
در $q$ سطر بعدی در هر سطر یک درخواست از انواعی که در صورت سوال آمده به شما داده میشود و شما باید کارهای مربوط به آن را انجام دهید.
# خروجی
باید در هر سطر از خروجی، پیامهایی که توسط دستورها میآید را چاپ کنید.
# مثالها
<details class="yellow">
<summary>
**تست نمونه فاز ۱**
</summary>
----------
## ورودی نمونه ۱
```
3
codeing hacking talking
14
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 52000001
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEK.NET 10 110 PROJECT 30000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 ESHGHI 15000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 3 working
ADD-JOB-SKILL 3 talking
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 sleeping
````
## خروجی نمونه ۱
```
user id is 1
invalid salary
job id is 1
invalid name
job id is 2
invalid timetype
user id is 2
invalid index
invalid index
skill added
skill added
skill added
repeated skill
invalid skill
````
+ کارجویی به نام «`Amin`» با شمارهی ۱ اضافه میشود.
+ «`Hamed`» نمیتواند اضافه شود چون باید سه رقم سمت راست حقوقش ۰ باشد.
+ موقعیت کاری به نام «`Quera`» با شمارهی ۱ اضافه میشود.
+ «`YEK.NET`» حاوی کاراکتر `.` است که برای نام قابل قبول نیست.
+ موقعیت کاری به نام «`YEKtaNET`» با شمارهی ۲ اضافه میشود.
+ شرایط زمانی به نام «`ESHGHI`» وجود ندارد.
+ کارجوی دیگری با نام «`Amin`» با شمارهی ۲ اضافه میشود. (نام تکراری مشکلی نیست.)
+ موقعیت کاری با شمارهی ۳ وجود ندارد. (حتی اگر مهارت درست نبود باید به شماره خطا بدهیم.)
+ موقعیت کاری با شمارهی ۳ وجود ندارد.
+ مهارت «`talking`» به شرکت شمارهی ۲ یعنی «`YEKtaNET`» اضافه شد.
+ مهارت «`codeing`» به کارجوی شمارهی ۲ اضافه شد.
+ مهارت «`talking`» به کارجوی شمارهی ۱ اضافه شد.
+ مهارت تکراری نباید اضافه شود.
+ مهارت داده شده باید در لیست اولیه مهارتها باشد.
</details>
<details class="yellow">
<summary>
**تست نمونه فاز ۲**
</summary>
----------
## ورودی نمونه ۲
```
3
codeing hacking talking
27
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 34000000
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
JOB-STATUS 1
JOB-STATUS 2
JOB-STATUS 3
USER-STATUS 1
USER-STATUS 2
USER-STATUS 3
VIEW 1 1
VIEW 1 2
VIEW 1 1
VIEW 3 1
VIEW 2 1
VIEW 2 4
VIEW 2 0
JOB-STATUS 1
JOB-STATUS 2
JOB-STATUS 3
USER-STATUS 1
USER-STATUS 2
USER-STATUS 3
````
## خروجی نمونه ۲
```
user id is 1
user id is 2
job id is 1
job id is 2
user id is 3
skill added
skill added
skill added
Quera-0-
YEKtaNET-0-(talking,0)
invalid index
Amin-(talking,0)
Hamed-(codeing,0)
Amin-
tracked
tracked
tracked
tracked
tracked
invalid index
invalid index
Quera-4-
YEKtaNET-1-(talking,1)
invalid index
Amin-(talking,1)
Hamed-(codeing,0)
Amin-
````
+ کارجویی به نام «`Amin`» با شمارهی ۱ اضافه میشود.
+ کارجویی به نام «`Hamed`» با شمارهی ۲ اضافه میشود.
+ موقعیت کاری به نام «`Quera`» با شمارهی ۱ اضافه میشود.
+ موقعیت کاری به نام «`YEKtaNET`» با شمارهی ۲ اضافه میشود.
+ کارجویی به نام «`Amin`» با شمارهی ۳ اضافه میشود.
+ مهارت «`talking`» به موقعیت کاری شمارهی ۲ اضافه میشود.
+ مهارت «`codeing`» به کارجوی شمارهی ۲ اضافه میشود.
+ مهارت «`talking`» به کارجوی شمارهی ۱ اضافه میشود.
+ چون «`Quera`» هیچ مشاهدهای ندارد، پس ۰ چاپ میشود و چون هیچ مهارتی ندارد خالی است.
+ چون «`YEKtaNET`» هیچ مشاهدهای ندارد، پس ۰ چاپ میشود و چون هیچ کارجویی با مهارت «`talking`» این موقعیت کاری را ندیده، جلوی آن صفر چاپ میشود.
+ موقعیت کاری با شمارهی ۳ وجود ندارد.
+ مهارتهای »`Amin`» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته میشود.
+ مهارتهای »`Hamed`» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته میشود.
+ کارجوی «`Amin`» مهارتی ندارد.
+ مشاهده ثبت میشود.
+ مشاهده ثبت میشود.
+ مشاهده ثبت میشود.
+ مشاهده ثبت میشود.
+ مشاهده ثبت میشود.
+ موقعیت کاری با شمارهی ۴ وجود ندارد.
+ موقعیت کاری با شمارهی ۰ وجود ندارد.
+ موقعیت کاری «`Quera`» مجموعاً ۴ بار دیده شده است.
+ موقعیت کاری «`YEKtaNET`» یکبار دیده شده و یک نفر مهارت «`talking`» را داشته است.
+ موقعیت کاری با شمارهی ۳ وجود ندارد.
+ مهارتهای »`Amin`» و یک موقعیت کاری با مهارت آن دیده شده است.
+ مهارتهای »`Hamed`» در هیچ موقعیت کاری دیده نشده پس جلوی آن صفر نوشته میشود.
+ کارجوی «`Amin`» مهارتی ندارد.
</details>
<details class="yellow">
<summary>
**تست نمونه فاز ۳**
</summary>
----------
## ورودی نمونه ۳
```
3
codeing hacking talking
20
ADD-USER Amin 72 PARTTIME 52000000
ADD-USER Hamed 30 FULLTIME 34000000
ADD-JOB Quera 10 110 FULLTIME 1000000
ADD-JOB YEKtaNET 10 110 PARTTIME 1000000
ADD-USER Amin 25 PROJECT 15000000
ADD-JOB-SKILL 2 talking
ADD-USER-SKILL 2 codeing
ADD-USER-SKILL 1 talking
VIEW 1 1
VIEW 1 2
VIEW 1 1
VIEW 2 1
VIEW 3 1
VIEW 2 2
VIEW 1 1
VIEW 2 1
GET-JOBLIST 0
GET-JOBLIST 1
GET-JOBLIST 2
GET-JOBLIST 3
````
## خروجی نمونه ۳
```
user id is 1
user id is 2
job id is 1
job id is 2
user id is 3
skill added
skill added
skill added
tracked
tracked
tracked
tracked
tracked
tracked
tracked
tracked
invalid index
(2,51002)(1,43001)
(1,30001)(2,24002)
(2,19002)(1,19001)
````
</details>