+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
# توضیحات اولیه پروژه
میخواهیم یک سامانه برای پیشنهاد موقعیت کار به کارجوها طراحی کنیم. این سامانه باید بتواند اطلاعات آنها را دریافت کند و برای هر کارجو مناسبترین کار را پیشنهاد دهد. همچنین این سیستم با توجه به بازدیدهایی که کارجوها از موقعیتهای کاری میکنند تغییر میکند.
تعدادی موقعیت کار داریم و هر موقعیت کار دارای ویژگیهای «نام موقعیت کار»، «بازهی سنی مورد نیاز این کار»، «وضعیت ساعتکاری (تماموقت / پارهوقت / پروژهای)»، «حقوق پیشنهادی» و «مهارتهای مورد نیاز برای این موقعیت کاری»
همچنین هر کارجو ویژگیهای «نام کارجو»، «سن کارجو»، «وضعیت ساعتکاری (تماموقت / پارهوقت / پروژهای)»، «حقوق مورد انتظار کارجو» و «مهارتهای این کارجو» را دارد.
# دستورها
به شما یک لیست از تمام مهارتهای موجود داده میشود و از شما میخواهیم تعدادی کوئری را پیادهسازی کنید:
## فاز اول
<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`هایی کارجوها با این مهارت داشتند را به صورت صعودی بر اساس این تعداد چاپ کنید. اگر دو مهارت تعداد `view` برابری داشت، در الویت دوم، برحسب رشتهی مهارت به صورت الفبایی مرتب کنید.
</details>
<details class="green">
<summary>
**وضعیت کارجو (`USER-STATUS`)**
</summary>
----------
```
USER-STATUS <USER-ID>
```
در این دستور، باید مهارتها را به ترتیب نشان دهید. دقت کنید ترتیب مهارتها، بر اساس مشاهدات کارجو تغییر میکند.
+ اگر کارجویی با شمارهی `<USER-ID>` وجود ندارد، خطای `invalid index` را چاپ کنید. تضمین میشود `ID` دادهشده، عددی صحیح باشد.
+ در غیر این صورت نام کارجو، سپس با یک `-` و برای همهی مهارتهایی که در این کارجو هست در یک `(,)` ابتدا نام مهارت و سپس تعداد `view`هایی برای موقعیتهای کاری با این مهارت داشتند را به صورت صعودی بر اساس این تعداد چاپ کنید. اگر دو مهارت تعداد `view` برابری داشت، در الویت دوم، برحسب رشتهی مهارت به صورت الفبایی مرتب کنید.
</details>
## فاز سوم
<details class="green">
<summary>
**دریافت لیست کارها (`GET-JOBLIST`)**
</summary>
----------
```
GET-JOBLIST <USER-ID>
```
+ اگر کارجویی با شمارهی `<USER-ID>` وجود ندارد، خطای `invalid index` را چاپ کنید. تضمین میشود `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>
# نکات
+ همهی عبارتهای داخل `<>` یک رشته به طول حداقل ۱ و حداکثر ۱۰ از کاراکترهای رقم، حروف بزرگ و کوچک و `.` است.
+ اگر چند خطا از خطاهای بالا پیش آمد، تنها خطایی را چاپ کنید که زودتر آمده است.
+ تضمین میشود همهی مقادیر `<SALARY>`، `<USER-ID>`، `<JOB-ID>`، `<AGE>`، `<MINAGE>` و `<MAXAGE>` همواره عدد صحیح داده میشود.
# زیرمسئلهها
|زیرمسئله | نمره | محدودیت |
|:---:|:---:|:---:|
| ۱ | ۳۳ | فاز اول |
| ۲ | ۳۳ | فاز دوم |
| ۲ | ۳۴ | فاز سوم |
# ورودی
در سطر اول ورودی، عدد صحیح و مثبت $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>