+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
---------
پس از یک حادثه در خلیج مهآلود $n$ نفر باید با قایقهای نجات به ساحل منتقل شوند.
هر نفر وزن مشخصی دارد. هر قایق ظرفیت تحمل وزن $w$ دارد و در هر قایق **حداکثر دو نفر** میتوانند سوار شوند.
برای کاهش زمان عملیات، فرمانده گفته باید با **کمترین تعداد قایق** همه افراد منتقل شوند.
اگر دو نفر در یک قایق باشند، مجموع وزنشان باید حداکثر $w$ باشد.
به شما تعداد افراد $n$، ظرفیت قایق $w$ و وزن هر فرد داده میشود.
در هر قایق حداکثر 2 نفر میتوانند سوار شوند و مجموع وزن آنها نباید از $w$ بیشتر شود.
همچنین **تضمین می شود** که وزن هر فرد در بازه بین $1$ تا $w$ می باشد.
کمترین تعداد قایق لازم برای انتقال همه افراد را چاپ کنید.
# ورودی
در خط اول ورودی دو عدد $n$ و $w$ میآید و سپس در خط دوم $n$ عدد صحیح با فاصله میآید که نشاندهنده وزن افراد می باشد
$$ 1 \le n \le 2 \cdot 10^5 $$
$$ 1 \le w \le 10^9 $$
# خروجی
در تنها خط خروجی یک عدد برابر کمینه تعداد قایق مورد نیاز چاپ کنید.
# مثال
### ورودی
```
4 10
7 2 3 9
```
### خروجی
```
3
```
### ورودی
```
6 7
1 2 3 4 5 6
```
### خروجی
```
3
```
+ محدودیت زمان: ۲ ثانیه
+ محدودیت حافظه: ۵۱۲ مگابایت
----
در جشنوارهی شهر، برای هر شرکتکننده یک «مهر ورودی» صادر شده که روی آن یک عدد به نام **کد مهر** حک شده است. بهخاطر خطای دستگاه چاپ، بعضی مهرها کدهای تکراری دارند و ورود با کد تکراری ممنوع است.
انبار جشنواره یک دستگاه اصلاح دارد که در هر حرکت میتواند کد یک مهر را **۱ واحد افزایش یا کاهش** دهد.
هر حرکت **۱ واحد هزینه** دارد. حذف مهرها ممنوع است و باید با اصلاح کدها مشکل را حل کنید.
برای سادهتر شدن کنترل ورودی، مسئول جشنواره تصمیم گرفته بعد از اصلاح، کدهای نهایی دقیقاً یک دنبالهی پشتسرهم باشند یعنی اگر کدهای نهایی را مرتب کنیم باید دقیقاً برابر باشند با:
$$x, x+1, x+2, ..., x+n-1$$
آرایهای از $n$ عدد صحیح داریم که به صورت زیر می باشد: $$a_1, a_2, \ldots , a_n$$ در هر حرکت میتوانید یک عدد را $+1$ یا $-1$ کنید و هزینهی هر حرکت $1$ است.
هدف این است که در پایان، پس از مرتبسازی، اعداد نهایی دقیقا یک بازهی پشتسرهم به شکل بالا باشند و **مجموع هزینهی تغییرات کمینه** شود.
# ورودی
در خط اول ورودی عدد $n$ میآید و سپس در خط دوم $n$ عدد صحیح با فاصله میآید که نشاندهنده کد مهر می باشد
$$ 1 \le n \le 2 \cdot 10^5 $$
$$ | a_i | \le 10^9 $$
# خروجی
در تنها خط خروجی یک عدد برابر کمینه تعداد مراحل مورد نیاز چاپ کنید.
# مثال
### ورودی
```
3
7 7 7
```
### خروجی
```
2
```
می توانیم اعداد رو به $6,7,8$ تبدیل کنیم و برای انجام این کار به $2$ تغییر نیاز داریم پس جواب کمینه برابر با $2$ می باشد.
### ورودی
```
5
0 2 4 6 8
```
### خروجی
```
6
```
شما بهتازگی به تیم **«اتاق فرمان»** یک شرکت بزرگ اضافه شدهاید جایی که داشبورد مدیریتی، قلب تصمیمگیری روزانهی شرکت است.
اما یک مشکل جدی وجود دارد:
هر روز صدها اعلان از سیستمهای مختلف دریافت می شود از خطاهای حیاتی گرفته تا پیامهای اجتماعی و هشدارهای مالی.
مدیرها میگویند:
+ «اعلانهای مهم گم میشوند!»
+ «نمیفهمیم کدامها را خواندهایم!»
+ «وقتی دنبال یک چیز میگردیم، سیستم کند و گیج میشود!»
وظیفهی شما این است که **اتاق فرمان** را طوری پیادهسازی کنید که مثل یک اتاق کنترل حرفهای عمل کند:
+ اعلانها را نمایش دهد
+ فیلتر و مرتبسازی انجام دهد
+ وضعیت خوانده/نخوانده را مدیریت کند
+ و همهچیز را حتی بعد از رفرش صفحه به خاطر بسپارد
پروژهی اولیه آماده است و **فقط منطق جاوااسکریپت داخل فایل `main.js` ناقص است**.
ظاهر کلی برنامه به شکل زیر است:

پروژه اولیه را از [این لینک](https://quera.org/qbox/download/0TmqYDB5F7/initial_project.zip) دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
```
initial_project/
├─ index.html
├─ styles.css
├─ <mark class="violet">main.js</mark>
├─ js/
└─ data.js
├─ fonts/
```
در فایل `js/data.js` تابع `fetchNotificationsData()` وجود دارد که با کمی تاخیر (۱۵۰ms) یک لیست اعلان برمیگرداند:
```js
// Promise<Notification[]>
fetchNotificationsData()
```
هر اعلان چنین ساختاری دارد:
```js
{
id: "n1",
title: "...",
body: "...",
category: "system" | "social" | "finance",
createdAt: 1700000000000
}
```
## جزئیات پیادهسازی
<details class="yellow">
<summary>
دسترسی به المانها
</summary>
المانها را با `id` های زیر پیدا کنید:
- `searchInput`
- `categoryFilter`
- `sortSelect`
- `markAllRead`
- `unreadCount`
- `notificationsList`
**توجه مهم:** برخی از این المانها (و همچنین spinner) دارای `data-testid` هستند که در تستها استفاده میشوند**از تغییر یا حذف `data-testid` ها خودداری کنید.**
</details>
<details class="yellow">
<summary>
راهاندازی اولیه
</summary>
در شروع برنامه:
1. کنترلها (input/select/button) باید **غیرفعال** باشند.
2. `fetchNotificationsData()` را صدا بزنید و بعد از دریافت داده:
- دادهها را در state نگه دارید
- کنترلها را **فعال** کنید
- لیست را رندر کنید (بر اساس فیلترهای فعلی)
</details>
<details class="yellow">
<summary>
رندر لیست
</summary>
تابع `renderNotifications(list)` را پیادهسازی کنید:
اگر لیست خالی بود:
+ یک `<li>` با:
+ کلاس `empty`
+ `data-testid="empty"`
+ متن: `اعلانی یافت نشد`
اگر آیتم وجود داشت:
برای هر اعلان:
+ یک `<li>` با:
+ کلاس `notif`
+ `data-testid="notif-item"`
+ ویژگی `data-id="<id>"`
+ اگر اعلان خواندهشده است:
+ کلاس `is-read` به `<li>` اضافه شود
+ داخل هر آیتم دو دکمه وجود دارد:
1. **دکمه پین (اختیاری)**
+ `data-testid="pin-btn"`
+ ویژگی `aria-pressed="true | false"`
2. **دکمه تغییر وضعیت خواندهشدن**
+ `data-testid="toggle-read-btn"`
متن دکمهها آزاد است و در تستها بررسی نمیشود؛ فقط رفتار آنها مهم است.
</details>
<details class="yellow">
<summary>
شمارنده خواندهنشدهها
</summary>
عدد داخل المان `#unreadCount` باید همیشه برابر باشد با:
> تعداد اعلانهایی که **در کل دادهها** خواندهنشده هستند(نه فقط اعلانهای فیلترشده)
</details>
<details class="yellow">
<summary>
فیلترها
</summary>
دو نوع فیلتر داریم:
1. جستجو (Search)
+ متن واردشده باید (case-insensitive) در `title` یا `body` شامل باشد (`includes`)
2. دستهبندی (Category)
+ اگر `categoryFilter` مقدار داشته باشد، فقط همان دسته نمایش داده شود
</details>
<details class="yellow">
<summary>
مرتبسازی
</summary>
دو حالت:
- `newest` : جدیدترینها بالا (createdAt نزولی)
- `oldest` : قدیمیترینها بالا (createdAt صعودی)
قانون مهم: **آیتمهای پینشده همیشه بالاتر از بقیه نمایش داده شوند** (قبل از مرتبسازی زمانی).
</details>
<details class="yellow">
<summary>
Debounce + Spinner
</summary>
تایپ در searchInput:
+ اگر **هر دو فیلتر search و category خالی باشند**:
+ فوراً رندر انجام شود
+ بدون spinner
+ هر debounce معلق لغو شود
+ در غیر این صورت:
+ فوراً spinner نمایش داده شود
+ فیلتر بعد از **۸۰۰ms** از آخرین ورودی اعمال شود
تغییر categoryFilter:
+ اگر هر دو فیلتر خالی باشند:
+ فوراً و بدون spinner رندر شود
+ در غیر این صورت:
+ فوراً spinner
+ اعمال فیلتر بعد از **۳۰۰ms**
اگر کاربر قبل از پایان debounce دوباره ورودی بدهد، تایمر قبلی باید **ریست** شود.
Spinner
تابع `showSpinner()` باید:
+ یک `<li>` با کلاس `spinner-row`
+ و `data-testid="spinner"`
+ داخل لیست اعلانها نمایش دهد
</details>
## نکات
- نصب/استفاده از هر کتابخانه یا فریمورک در کد اصلی ممنوع است (فقط JS خام).
- فقط مجاز به تغییر فایل `main.js` هستید.
- از تغییر `data-testid` ها خودداری کنید تا تستها قابل اجرا بمانند.
## آنچه باید آپلود کنید
فقط فایل `main.js` نهایی را ارسال کنید.
(فایل به صورت zip ارسال شود و ساختار باید به شکل زیر باشد)
```
answer.zip
└─ main.js
```
**کد شما باید روی PostgreSQL قابل اجرا باشد.**
---
**پوریا** *(Pouria)* از **مهندسین نرمافزار گردنکلفت دوتانت** *(DotaNet)،* به تازگی به عنوان **مدیر آموزش مسابقات مجموعه کوئرا** در این مجموع شروع به کار کرده است. او که به دلیل **محاسبات** و **کنتوراندازیهای خفن مالی** به **پولیا** *(Poolia)* معروف شده است در اولین برخوردش در کوئرا با **دوین** *(Dwin)* متوجه شده است که دوین، **از پرخرجترین کارکنان کوئراست!** او که به گفتهی مسئولین مالی کوئرا، همواره **به اندازه یک تیم کامل از سایر کارکنان کوئرا،** حقوق دریافت میکند؛ برای **طراحی کانتست جدید** مجموعه [**فناوا** *(Fanava)*](https://fanava.net/) نیز درخواست وجوهات سنگین از پوریا کرده است. از آنجایی که **پوریا** مثل همیشه درگیر برگزاری تعداد زیادی از مسابقات مهندسی نرمافزارانه است، از شما در این سوال برای **کنتور اندازی** بر اساس **دیتاست مشخصی از مجموعه مسابقات برنامهنویسی برگزار شده در گذشته شامل تیمهای شرکتکننده از سراسر جهان،** کمک میخواهد **تا با دستی پر و آمارهایی جذاب به مقابله با دوین پرخرج برود...**

# **جزئیات پایگاهداده**
**دیتاستی** که در این سوال به آن میپردازیم، **متشکل از اطلاعات یک پلتفرم مسابقات برنامهنویسی** است. این دیتابیس شامل اطلاعات شرکتکنندگان، مسابقات، سوالات، ارسالها، تیمها، دستاوردها و تاریخچه امتیازات میباشد.
**دادههای اولیه** را از [این لینک](/contest/assignments/98478/download_problem_initial_project/330235/) دانلود کنید.
<details class="yellow">
<summary>**ایمپورت کردن دادههای اولیه**</summary>
از **نصب بودن** *PostgreSQL* روی سیستم خود اطمینان حاصل کنید. برای ایمپورت کردن دادههای اولیه میتوانید از یکی از **دو روش زیر** اقدام کنید:
## **روش اول: استفاده از** *CLI*
با استفاده از *CLI* **دستور** زیر را وارد کنید تا دادههای اولیه **ایمپورت** شوند:
```bash terminal terminal
psql -U postgres -f /path/to/initial.sql
```
- که در این دستور مسیر **فایل** `initial.sql` را به صورت **مطلق** یا **نسبی** میتوانید **آدرسدهی** کنید.
## **روش دوم: استفاده از** *GUI*
اگر *GUI* را ترجیح میدهید، پس از نصب **دیتاگریپ** و اتصال به *PostgreSQL* با **یوزر** *postgres،* باید روی **دیتاسورس** و **کانکشن** *postgres* راستکلیک کنید و از منوی *SQL Scripts،* گزینهی *Run SQL Script* را انتخاب کنید. سپس **فایل** `initial.sql` را پیدا و تایید کنید. در انتها روی *Run* کلیک کنید تا اسکریپت اجرا شود و دادهها وارد دیتابیس شوند.
</details>
<details class="grey">
<summary>**توضیحات جداول دیتاست**</summary>
## **جدول** `country`
این جدول اطلاعات مربوط به **کشورها** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا برای کشور *(کلید اصلی)* |
| `name` | `varchar(100)` | نام کشور |
| `code` | `varchar(10)` | کد کشور |
| `continent` | `varchar(50)` | قاره |
| `population` | `bigint` | جمعیت کشور |
| `gdp_per_capita` | `decimal(12,2)` | **تولید ناخالص** داخلی سرانه |
## **جدول** `university`
این جدول اطلاعات مربوط به **دانشگاهها** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی **یکتا** برای دانشگاه *(کلید اصلی)* |
| `name` | `varchar(200)` | نام دانشگاه |
| `country_id` | `integer` | شناسهی کشور مرتبط (کلید خارجی به جدول `country`) |
| `ranking` | `integer` | رتبهی جهانی دانشگاه |
| `founded_year` | `integer` | سال تاسیس |
| `student_count` | `integer` | تعداد دانشجویان |
| `is_public` | `boolean` | دانشگاه دولتی یا خصوصی |
## **جدول** `team`
این جدول اطلاعات مربوط به **تیمهای برنامهنویسی** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا برای تیم *(کلید اصلی)* |
| `name` | `varchar(100)` | نام تیم |
| `founded_year` | `integer` | سال تاسیس |
| `is_active` | `boolean` | وضعیت فعال بودن تیم |
| `motto` | `varchar(500)` | شعار تیم |
| `max_members` | `integer` | حداکثر تعداد اعضا |
| `website` | `varchar(200)` | آدرس وبسایت |
## **جدول** `contestant`
این جدول اطلاعات مربوط به **شرکتکنندگان** *(برنامهنویسان)* را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا برای شرکتکننده *(کلید اصلی)* |
| `username` | `varchar(50)` | نام کاربری *(یکتا)* |
| `first_name` | `varchar(100)` | نام |
| `last_name` | `varchar(100)` | نام خانوادگی |
| `email` | `varchar(200)` | ایمیل |
| `rating` | `integer` | امتیاز فعلی *(پیشفرض 1200)* |
| `max_rating` | `integer` | بیشترین امتیاز کسب شده |
| `country_id` | `integer` | شناسهی کشور (کلید خارجی به جدول `country`) |
| `university_id` | `integer` | شناسهی دانشگاه (کلید خارجی به جدول `university`) |
| `registration_date` | `date` | تاریخ ثبتنام |
| `last_online` | `timestamp` | آخرین زمان آنلاین بودن |
| `is_admin` | `boolean` | آیا ادمین است |
| `contribution` | `integer` | امتیاز مشارکت |
| `friend_count` | `integer` | تعداد دوستان |
## **جدول** `team_membership`
این جدول رابطهی **چند به چند** بین **شرکتکنندگان** و **تیمها** را مدیریت میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا *(کلید اصلی)* |
| `contestant_id` | `integer` | شناسهی شرکتکننده *(کلید خارجی)* |
| `team_id` | `integer` | شناسهی تیم *(کلید خارجی)* |
| `joined_date` | `date` | تاریخ پیوستن |
| `left_date` | `date` | تاریخ خروج *(در صورت خروج)* |
| `role` | `varchar(50)` | نقش در تیم *(leader, co-leader, member)* |
| `is_active` | `boolean` | آیا عضویت فعال است |
## **جدول** `achievement`
این جدول اطلاعات مربوط به **دستاوردها** و **نشانها** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا *(کلید اصلی)* |
| `name` | `varchar(100)` | نام دستاورد |
| `description` | `text` | توضیحات |
| `badge_color` | `varchar(20)` | رنگ نشان *(gold, silver, bronze, platinum)* |
| `points` | `integer` | امتیاز دستاورد |
| `category` | `varchar(50)` | دستهبندی *(contest, problem, contribution, special)* |
## **جدول** `contestant_achievement`
این جدول **دستاوردهای کسب شده** توسط هر شرکتکننده را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا *(کلید اصلی)* |
| `contestant_id` | `integer` | شناسهی شرکتکننده *(کلید خارجی)* |
| `achievement_id` | `integer` | شناسهی دستاورد *(کلید خارجی)* |
| `earned_date` | `timestamp` | زمان کسب دستاورد |
| `contest_id` | `integer` | شناسهی مسابقه مرتبط *(اختیاری)* |
## **جدول** `contest`
این جدول اطلاعات مربوط به **مسابقات برنامهنویسی** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا برای مسابقه *(کلید اصلی)* |
| `name` | `varchar(200)` | نام مسابقه |
| `contest_type` | `varchar(50)` | نوع مسابقه *(Educational, Div1, Div2, Global, Championship)* |
| `division` | `integer` | دستهبندی *(1, 2, 3, 4 یا NULL)* |
| `start_time` | `timestamp` | زمان شروع مسابقه |
| `duration_minutes` | `integer` | مدت زمان مسابقه به دقیقه |
| `max_participants` | `integer` | حداکثر تعداد شرکتکنندگان |
| `is_rated` | `boolean` | آیا مسابقه امتیازدهی میشود |
| `is_official` | `boolean` | آیا مسابقه رسمی است |
| `difficulty_rating` | `decimal(4,2)` | سطح دشواری میانگین *(1.0-10.0)* |
| `prize_pool` | `decimal(10,2)` | مجموع جوایز |
| `sponsor` | `varchar(200)` | اسپانسر |
| `created_by` | `integer` | سازندهی مسابقه (کلید خارجی به `contestant`) |
## **جدول** `contest_registration`
این جدول **اطلاعات ثبتنام** و **نتایج شرکتکنندگان** در هر مسابقه را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا *(کلید اصلی)* |
| `contestant_id` | `integer` | شناسهی شرکتکننده *(کلید خارجی)* |
| `contest_id` | `integer` | شناسهی مسابقه *(کلید خارجی)* |
| `registration_time` | `timestamp` | زمان ثبتنام |
| `is_virtual` | `boolean` | آیا شرکت مجازی است |
| `final_rank` | `integer` | رتبهی نهایی |
| `rating_change` | `integer` | تغییر امتیاز |
| `new_rating` | `integer` | امتیاز جدید |
| `problems_solved` | `integer` | تعداد سوالات حل شده |
| `penalty_time` | `integer` | زمان جریمه |
## **جدول** `tag`
این جدول **برچسبهای دستهبندی سوالات** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا *(کلید اصلی)* |
| `name` | `varchar(100)` | نام برچسب |
| `description` | `text` | توضیحات |
| `difficulty_weight` | `decimal(3,2)` | وزن سختی |
## **جدول** `problem`
این جدول **اطلاعات مربوط به سوالات مسابقات** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا برای سوال *(کلید اصلی)* |
| `contest_id` | `integer` | شناسهی مسابقه (کلید خارجی به جدول `contest`) |
| `problem_index` | `varchar(5)` | شاخص سوال *(A, B, C, D1, D2, ...)* |
| `title` | `varchar(200)` | عنوان سوال |
| `difficulty` | `varchar(20)` | سطح دشواری *(Easy, Medium, Hard, Expert)* |
| `points` | `integer` | امتیاز سوال |
| `time_limit_ms` | `integer` | محدودیت زمانی به میلیثانیه |
| `memory_limit_mb` | `integer` | محدودیت حافظه به مگابایت |
| `solved_count` | `integer` | تعداد حلهای موفق |
| `attempted_count` | `integer` | تعداد تلاشها |
| `rating` | `integer` | سطح سختی سوال *(800-3500)* |
| `author_id` | `integer` | نویسندهی سوال (کلید خارجی به `contestant`) |
## **جدول** `problem_tag`
این جدول **رابطهی چند به چند** بین **سوالات** و **برچسبها** را ایجاد میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا *(کلید اصلی)* |
| `problem_id` | `integer` | شناسهی سوال *(کلید خارجی)* |
| `tag_id` | `integer` | شناسهی برچسب *(کلید خارجی)* |
## **جدول** `submission`
این جدول اطلاعات مربوط به **ارسالهای شرکتکنندگان برای سوالات** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا برای ارسال *(کلید اصلی)* |
| `contestant_id` | `integer` | شناسهی شرکتکننده (کلید خارجی به جدول `contestant`) |
| `problem_id` | `integer` | شناسهی سوال (کلید خارجی به جدول `problem`) |
| `contest_id` | `integer` | شناسهی مسابقه (کلید خارجی به جدول `contest`) |
| `submit_time` | `timestamp` | زمان ارسال |
| `status` | `varchar(30)` | وضعیت ارسال |
| `execution_time_ms` | `integer` | زمان اجرا به میلیثانیه |
| `memory_kb` | `integer` | حافظهی مصرفی به کیلوبایت |
| `language` | `varchar(50)` | زبان برنامهنویسی |
| `code_length` | `integer` | طول کد |
| `test_cases_passed` | `integer` | تعداد تستکیسهای موفق |
| `total_test_cases` | `integer` | تعداد کل تستکیسها |
| `is_practice` | `boolean` | آیا ارسال تمرینی است |
## **جدول** `rating_history`
این جدول **تاریخچه تغییرات امتیاز شرکتکنندگان** را ذخیره میکند.
| **نام ستون** | **نوع داده** | **توضیحات** |
|----------|----------|---------|
| `id` | `integer` | شناسهی یکتا *(کلید اصلی)* |
| `contestant_id` | `integer` | شناسهی شرکتکننده *(کلید خارجی)* |
| `contest_id` | `integer` | شناسهی مسابقه *(کلید خارجی)* |
| `old_rating` | `integer` | امتیاز قبلی |
| `new_rating` | `integer` | امتیاز جدید |
| `rating_change` | `integer` | میزان تغییر |
| `rank_in_contest` | `integer` | رتبه در مسابقه |
| `recorded_at` | `timestamp` | زمان ثبت |
</details>
## **مطلوبات**
کوئریهایی بنویسید که خروجیهای مطلوب زیر را بهدست آورد. توجه کنید که هر کوئری نمرهای جداگانه دارد و اگر کوئری قسمتی را **نتوانستید** بنویسید، کوئریهایی که حل کردید را **بفرستید** و کوئری آن قسمت را **خالی** بگذارید.
1. برای **هر شرکتکننده** که **امتیاز فعلی** او **بیشتر از میانگین** امتیاز **شرکتکنندگان قارهی خودش** است، اطلاعات **نام کاربری، نام کامل** (`first_name` و `last_name` با فاصله ترکیب شوند)، **امتیاز فعلی، بیشترین امتیاز، نام قاره، نام دانشگاه** (در صورت **نداشتن** دانشگاه، عبارت `Self-taught` نمایش داده شود) و همچنین یک **ستون** به **نام** `rating_tier` که بر اساس **امتیاز** مشخص کند:
- اگر **امتیاز** >= `3000` باشد: `Legendary`
- اگر **امتیاز** >= `2400` باشد: `Grandmaster`
- اگر **امتیاز** >= `1900` باشد: `Expert`
- **در غیر این صورت:** `Specialist`
نتایج باید **به ترتیب نزولی امتیاز** مرتب شوند و در صورت **برابری** امتیاز، **به ترتیب صعودی آیدی شرکتکننده.**
<details class="blue">
<summary>*نمونه خروجی کوئری اول*</summary>
| username | full_name | rating | max_rating | continent | university_name | rating_tier |
|----------|-----------|--------|------------|-----------|-----------------|-------------|
| tourist | Gennady Korotkevich | 3850 | 3979 | Europe | ITMO University | Legendary |
| petr | Petr Mitrichev | 3650 | 3750 | Europe | Moscow State University | Legendary |
| ecnerwala | Andrew He | 3500 | 3550 | North America | MIT | Legendary |
</details>
2. **برای هر تیم فعال،** ستونهای **نام تیم، تعداد اعضای فعال، میانگین امتیاز اعضای فعال** *(با دو رقم اعشار)،* **بالاترین امتیاز در بین اعضای فعال، نام کاربری عضوی که بالاترین امتیاز را دارد** *(در صورت تساوی، اولین نفر بر اساس آیدی)،* **مجموع جوایز کسب شده توسط اعضای تیم** (از جدول `contest_registration` **برای مسابقاتی که** `prize_pool > 0` دارند) **و همچنین یک ستون به نام** `team_level` که:
- اگر **میانگین امتیاز** >= `3000` باشد: `Elite`
- اگر **میانگین امتیاز** >= `2500` باشد: `Professional`
- اگر **میانگین امتیاز** >= `2000` باشد: `Advanced`
- **در غیر این صورت:** `Developing`
محاسبه و نمایش دهید. **فقط** تیمهایی را نمایش دهید که **حداقل ۲ عضو فعال** دارند. **نتایج باید به ترتیب نزولی میانگین امتیاز** مرتب شوند و در صورت برابری، **به ترتیب صعودی آیدی تیم.**
<details class="blue">
<summary>*نمونه خروجی کوئری دوم*</summary>
| team_name | active_members | avg_rating | max_rating | top_member | total_prize | team_level |
|-----------|----------------|------------|------------|------------|-------------|------------|
| Red Coders | 4 | 3412.50 | 3850 | tourist | (متغیر) | Elite |
</details>
3. **برای هر شرکتکننده** که در **حداقل ۲ مسابقه امتیازدهی شده** *(Rated)* شرکت کرده است، **اطلاعات نام کاربری، تعداد کل مسابقات شرکت کرده** *(Rated)،* **میانگین رتبه** در مسابقات، **بهترین رتبه** *(کمترین عدد)،* **مجموع تغییرات امتیاز** (`rating_change`)، رتبهی شرکتکننده **بر اساس مجموع تغییرات امتیاز در بین همهی شرکتکنندگان** *(با استفاده از DENSE_RANK و ترتیب نزولی)،* **تفاوت امتیاز فعلی با امتیاز اولیه** (بر اساس رابطه `rating` - `1200`) را برگردانید.
همچنین **فقط شرکتکنندگانی را نمایش دهید** که **مجموع تغییرات امتیاز آنها مثبت باشد.** نتایج باید **به ترتیب نزولی مجموع تغییرات امتیاز مرتب شوند** و در صورت برابری، **به ترتیب صعودی آیدی.**
<details class="blue">
<summary>*نمونه خروجی کوئری سوم*</summary>
| username | total_contests | avg_rank | best_rank | total_rating_change | performance_rank | rating_improvement |
|----------|----------------|----------|-----------|---------------------|------------------|-------------------|
| tourist | (متغیر) | (متغیر) | 1 | (متغیر) | 1 | 2650 |
</details>
4. **برای هر سوال که حداقل ۵ ارسال** *(Submission)* در **مسابقات اصلی** داشته (`is_practice` = `FALSE`)، **موارد شاخص سوال** (`problem_index`)، **عنوان سوال، نام مسابقه، نوع مسابقه، سطح دشواری سوال** (`difficulty`)، **امتیاز سختی سوال** (`rating`)، **تعداد کل ارسالها در مسابقه، تعداد ارسالهای موفق** *(Accepted)،* **نرخ موفقیت** *(درصد با دو رقم اعشار)،* **میانگین زمان اجرا برای ارسالهای موفق** *(با دو رقم اعشار)،* **یک ستون به نام** `actual_difficulty` که:
- اگر **نرخ موفقیت** < `20%` باشد: `Extremely Hard`
- اگر **نرخ موفقیت** < `40%` باشد: `Very Hard`
- اگر **نرخ موفقیت** < `60%` باشد: `Moderate`
- اگر **نرخ موفقیت** < `80%` باشد: `Easy`
- **در غیر این صورت:** `Very Easy`
- **یک ستون به نام** `difficulty_match` که **اگر سطح دشواری تعریف شده** با `actual_difficulty` **مطابقت داشته باشد** `Match` و **در غیر این صورت** `Mismatch` نمایش دهد.
نتایج باید **به ترتیب صعودی نرخ موفقیت** و **سپس به ترتیب صعودی آیدی سوال مرتب شوند.**
<details class="blue">
<summary>*نمونه خروجی کوئری چهارم*</summary>
| problem_index | problem_title | contest_name | contest_type | difficulty | problem_rating | total_submissions | accepted_count | success_rate | avg_execution_time | actual_difficulty | difficulty_match |
|---------------|---------------|--------------|--------------|------------|----------------|-------------------|----------------|--------------|-------------------|-------------------|------------------|
| E | Interactive Query | Codeforces Round 900 (Div. 1) | Div1 | Expert | 3200 | (متغیر) | (متغیر) | (متغیر) | (متغیر) | (متغیر) | (متغیر) |
</details>
# **فایل نهایی**
پس از پیادهسازی کوئریها، آن را در **فایل** `queries.sql` وارد کرده و سپس این فایل را **آپلود** کنید. کد شما باید به صورت زیر باشد:
```sql queries.sql sql
-- Section1
Your first query here
-- Section2
Your second query here
-- Section3
Your third query here
-- Section4
Your fourth query here
```
مجموعه [**فناوا** *(Fanava)*](https://fanava.net) که به تازگی **جشن ۲۲ سالگی مجموعه** خود را جشن گرفته است، تصمیم دارد تا **یک سیستم مدیریت کیف پول هوشمند** و **سرمایهگذاری** طراحی و پیادهسازی کند که **الهامگرفته از سرویسهای مالی شرکت فناوا است!** این سیستم از طریق **دستورات متنی** *(Command Line Interface)* کار میکند و **قابلیتهای پیشرفتهای** مانند *مدیریت چندین کیف پول، سرمایهگذاری در صندوقها، محاسبه سود و زیان، تراکنشهای زمانبندی شده و تشخیص فعالیتهای مشکوک* را دارا میباشد.
سیستم شامل **سه بخش اصلی** است. **بخش اول** مدیریت کاربران و کیف پولها است که هر کاربر میتواند حداکثر ۵ کیف پول داشته باشد و هر کیف پول دارای نوع مشخصی است. **بخش دوم** مدیریت صندوقهای سرمایهگذاری است که هر صندوق دارای نرخ سود سالانه، حداقل مبلغ سرمایهگذاری و ظرفیت محدود میباشد. **بخش سوم** سیستم امنیتی است که **تراکنشهای مشکوک** را بر اساس **الگوهای از پیش تعریفشده** شناسایی میکند.

# **انواع کیف پول**
**سه نوع کیف پول** در سیستم وجود دارد. **کیف پول اصلی** *(MAIN)* برای **تراکنشهای روزمره** استفاده میشود و **محدودیت** برداشت روزانه **ندارد. کیف پول پسانداز** *(SAVINGS)* برای **نگهداری بلندمدت پول** طراحی شده و **برداشت از آن محدود به سه بار در ماه است. کیف پول سرمایهگذاری** *(INVEST)* **مخصوص سرمایهگذاری در صندوقها است** و برداشت مستقیم از آن **امکانپذیر نیست** و ابتدا باید سرمایهگذاری فروخته شود.
# **شرح دستورات**
<details class="red">
<summary>**ثبتنام کاربر جدید**</summary>
**دستور** `REGISTER` برای **ایجاد یک کاربر جدید** در سیستم استفاده میشود. **هر کاربر با یک شناسه یکتا، نام و شماره ملی ثبت میشود.** شماره ملی باید **دقیقاً ۱۰ رقم باشد و تکراری نباشد.** پس از ثبتنام، یک کیف پول اصلی با **موجودی صفر** به صورت **خودکار** برای کاربر ایجاد میشود.
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
REGISTER --user <user_id> --name <full_name> --national-id <national_id>
```
- **در صورت موفقیت پیام** `User [user_id] registered successfully with main wallet` چاپ میشود. اگر شناسه کاربر تکراری باشد **پیام** `ERROR: user [user_id] already exists` نمایش داده میشود. **اگر شماره ملی تکراری باشد پیام** `ERROR: national ID already registered` چاپ میشود. اگر **شماره ملی ۱۰ رقم نباشد پیام** `ERROR: invalid national ID format` نمایش داده میشود.
</details>
<details class="blue">
<summary>**ایجاد کیف پول جدید**</summary>
**دستور** `CREATE_WALLET` برای ایجاد کیف پول اضافی برای کاربر استفاده میشود. هر کاربر میتواند حداکثر ۵ کیف پول داشته باشد. شناسه کیف پول باید در کل سیستم یکتا باشد.
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
CREATE_WALLET --user <user_id> --wallet <wallet_id> --type <MAIN|SAVINGS|INVEST>
```
- **در صورت موفقیت پیام** `Wallet [wallet_id] of type [type] created for user [user_id]` چاپ میشود. **اگر کاربر وجود نداشته باشد پیام** `ERROR: user [user_id] not found` نمایش داده میشود. **اگر کاربر قبلاً ۵ کیف پول داشته باشد پیام** `ERROR: maximum wallet limit reached for user [user_id]` چاپ میشود. **اگر شناسه کیف پول تکراری باشد پیام** `ERROR: wallet [wallet_id] already exists` نمایش داده میشود.
</details>
<details class="pink">
<summary>**واریز وجه**</summary>
**دستور** `DEPOSIT` برای **واریز مبلغ به یک کیف پول** استفاده میشود. **واریز به همه انواع کیف پول مجاز است. زمان تراکنش برای محاسبات بعدی ثبت میشود.**
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
DEPOSIT --wallet <wallet_id> --amount <amount> --time <yyyy-mm-dd-hh:mm>
```
- **در صورت موفقیت پیام** `Deposited [amount] to wallet [wallet_id]. New balance: [balance]` چاپ میشود. **مبلغ باید عدد صحیح مثبت باشد، در غیر این صورت پیام** `ERROR: amount must be positive` نمایش داده میشود.
</details>
<details class="orange">
<summary>**برداشت وجه**</summary>
**دستور** `WITHDRAW` برای **برداشت مبلغ از کیف پول** استفاده میشود. **برداشت از کیف پول سرمایهگذاری مستقیماً امکانپذیر نیست. برداشت از کیف پول پسانداز محدود به ۳ بار در هر ماه میلادی است.**
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
WITHDRAW --wallet <wallet_id> --amount <amount> --time <yyyy-mm-dd-hh:mm>
```
- **در صورت موفقیت پیام** `Withdrew [amount] from wallet [wallet_id]. New balance: [balance]` چاپ میشود. **اگر کیف پول از نوع سرمایهگذاری باشد پیام** `ERROR: cannot withdraw directly from investment wallet` نمایش داده میشود. **اگر تعداد برداشت از کیف پول پسانداز در ماه جاری به ۳ رسیده باشد پیام** `ERROR: monthly withdrawal limit reached for savings wallet` چاپ میشود.
</details>
<details class="blue">
<summary>**انتقال بین کیف پولها**</summary>
**دستور** `TRANSFER` برای **انتقال وجه بین دو کیف پول** استفاده میشود. انتقال بین کیف پولهای یک کاربر **رایگان** است اما انتقال به کیف پول کاربر دیگر **مشمول کارمزد ۰.۵ درصد میشود** که از مبلغ انتقال کسر میگردد. **انتقال مستقیم از کیف پول سرمایهگذاری امکانپذیر نیست.**
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
TRANSFER --from <source_wallet> --to <dest_wallet> --amount <amount> --time <yyyy-mm-dd-hh:mm>
```
- در صورت موفقیت برای **انتقال داخلی** *(بین کیف پولهای یک کاربر)* **پیام**`Transferred [amount] from [source] to [dest]` چاپ میشود. **برای انتقال خارجی پیام** `Transferred [amount] from [source] to [dest]. Fee: [fee]` چاپ میشود که *fee* **برابر با ۰.۵ درصد مبلغ** *(گرد شده به پایین)* است.
</details>
<details class="purple">
<summary>**ایجاد صندوق سرمایهگذاری**</summary>
- **دستور** `CREATE_FUND` برای **ایجاد یک صندوق سرمایهگذاری جدید توسط ادمین سیستم استفاده میشود.** هر صندوق دارای نرخ سود سالانه، **حداقل مبلغ سرمایهگذاری و ظرفیت کل میباشد.**
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
CREATE_FUND --fund <fund_id> --name <fund_name> --rate <annual_rate> --min <min_invest> --capacity <max_capacity>
```
- **نرخ سود به صورت درصد سالانه وارد میشود** *(مثلاً ۱۸ به معنای ۱۸ درصد).* **در صورت موفقیت پیام** `Fund [fund_id] created: [name] with [rate]% annual rate` چاپ میشود.
</details>
<details class="violet">
<summary>**سرمایهگذاری در صندوق**</summary>
**دستور** `INVEST` برای **سرمایهگذاری از کیف پول سرمایهگذاری در یک صندوق** استفاده میشود. **مبلغ از کیف پول سرمایهگذاری کسر شده** و در صندوق قرار میگیرد. زمان سرمایهگذاری برای محاسبه سود ذخیره میشود.
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
INVEST --wallet <wallet_id> --fund <fund_id> --amount <amount> --time <yyyy-mm-dd-hh:mm>
```
- **در صورت موفقیت پیام** `Invested [amount] from wallet [wallet_id] in fund [fund_id]` چاپ میشود. اگر **کیف پول از نوع سرمایهگذاری نباشد** پیام `ERROR: can only invest from investment wallet` نمایش داده میشود. **اگر مبلغ کمتر از حداقل صندوق باشد پیام** `ERROR: minimum investment for this fund is [min]` چاپ میشود. **اگر ظرفیت صندوق پر شده باشد پیام** `ERROR: fund capacity exceeded` نمایش داده میشود.
</details>
<details class="teal">
<summary>**فروش سرمایهگذاری**</summary>
**دستور** `SELL` برای **فروش سرمایهگذاری و بازگرداندن اصل و سود به کیف پول سرمایهگذاری** استفاده میشود. **سود بر اساس نرخ سالانه صندوق و تعداد روزهای سپریشده محاسبه میشود.**
- **فرمت محاسبه سود به این صورت است:** سود = (مبلغ × نرخ سالانه × تعداد روز) ÷ (۱۰۰ × ۳۶۵)
- **نتیجه به پایین گرد میشود.**
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
SELL --wallet <wallet_id> --fund <fund_id> --time <yyyy-mm-dd-hh:mm>
```
- **در صورت موفقیت پیام** `Sold investment in fund [fund_id]. Principal: [amount], Profit: [profit], Total: [total]` چاپ میشود. **اگر سرمایهگذاریای در این صندوق وجود نداشته باشد پیام** `ERROR: no investment found in fund [fund_id] for wallet [wallet_id]` نمایش داده میشود.
</details>
<details class="yellow">
<summary>**مشاهده پورتفوی**</summary>
**دستور** `PORTFOLIO` برای **مشاهده وضعیت سرمایهگذاریهای یک کیف پول در زمان مشخص** استفاده میشود. **سود محاسبهشده بر اساس زمان فعلی نمایش داده میشود.**
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
PORTFOLIO --wallet <wallet_id> --time <yyyy-mm-dd-hh:mm>
```
- **خروجی به صورت زیر است:**
```bash terminal terminal
Portfolio for wallet [wallet_id]:
| Fund | Principal | Current Value | Profit |
| [fund_id] | [amount] | [current] | [profit] |
Total Value: [sum]
```
- **اگر سرمایهگذاریای وجود نداشته باشد:**
```bash terminal terminal
Portfolio for wallet [wallet_id]:
No investments found.
```
</details>
<details class="green">
<summary>**مشاهده موجودی**</summary>
**دستور** `BALANCE` برای **مشاهده موجودی یک کیف پول** استفاده میشود.
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
BALANCE --wallet <wallet_id>
```
**- خروجی به صورت** `Wallet [wallet_id] ([type]): [balance]` است.
</details>
<details class="red">
<summary>**تاریخچه تراکنشها**</summary>
**دستور** `HISTORY` **برای مشاهده تاریخچه تراکنشهای یک کیف پول** استفاده میشود. تراکنشها **به ترتیب زمان مرتب میشوند.**
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
HISTORY --wallet <wallet_id>
```
- **خروجی به صورت زیر است:**
```bash terminal terminal
Transaction History for Wallet [wallet_id]:
| [time] | [type] | [amount] | [balance_after] | [description] |
```
- **انواع تراکنش شامل** `DEPOSIT`، `WITHDRAW`، `TRANSFER_IN`، `TRANSFER_OUT`، `INVEST` و `SELL` میباشد. **فیلد** `description` **شامل جزئیات اضافی مانند شناسه صندوق یا کیف پول مقصد است.**
</details>
<details class="blue">
<summary>**تشخیص فعالیت مشکوک**</summary>
**دستور** `SUSPICIOUS` **برای شناسایی فعالیتهای مشکوک یک کاربر در یک روز خاص استفاده میشود.** سیستم **چهار نوع فعالیت مشکوک** را شناسایی میکند.
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
SUSPICIOUS --user <user_id> --date <yyyy-mm-dd>
```
- **فعالیتهای مشکوک عبارتند از:** اول، تراکنشهای **با مبلغ بیش از ۵۰ میلیون که با کد** `LARGE_AMOUNT` مشخص میشوند. دوم، **بیش از ۵ تراکنش در یک ساعت از تمام کیف پولهای کاربر که با کد** `RAPID_TRANSACTIONS` مشخص میشود. سوم، **انتقال به بیش از ۳ کاربر متفاوت در یک روز که با کد** `MULTIPLE_RECIPIENTS` مشخص میشود. چهارم، **سرمایهگذاری و فروش سریع** *(فاصله کمتر از ۷ روز)* که با **کد** `QUICK_FLIP` مشخص میشود.
- **خروجی به صورت زیر است:**
```bash terminal terminal
Suspicious Activity for User [user_id] on [date]:
| [time] | [wallet_id] | [type] | [amount] | [reason] |
```
- اگر **فعالیت مشکوکی** وجود نداشته باشد **پیام** `No suspicious activity for user [user_id] on [date].` چاپ میشود.
</details>
<details class="yellow">
<summary>**گزارش روزانه**</summary>
**دستور** `DAILY_REPORT` برای **مشاهده خلاصه تراکنشهای کل سیستم در یک روز** استفاده میشود.
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
DAILY_REPORT --date <yyyy-mm-dd>
```
- **خروجی به صورت زیر است:**
```bash terminal terminal
Daily Report for [date]:
Total Deposits: [amount] ([count] transactions)
Total Withdrawals: [amount] ([count] transactions)
Total Transfers: [amount] ([count] transactions)
Total Investments: [amount] ([count] transactions)
Total Fees Collected: [amount]
Active Users: [count]
```
- **اگر تراکنشی وجود نداشته باشد پیام** `Daily Report for [date]:\nNo transactions found.` چاپ میشود.
</details>
<details class="grey">
<summary>**رتبهبندی صندوقها**</summary>
**دستور** `TOP_FUNDS` برای **مشاهده صندوقهای برتر** بر اساس مجموع سرمایهگذاری استفاده میشود.
- **فرمت دستور به صورت زیر است:**
```bash terminal terminal
TOP_FUNDS --limit <n>
```
- **خروجی به صورت زیر است:**
```bash terminal terminal
Top [n] Funds by Investment:
| Rank | Fund | Total Investment | Investors |
| 1 | [fund_id] | [total] | [count] |
```
</details>
# **نکات مهم**
**تمام مبالغ به صورت عدد صحیح و بر حسب ریال هستند.** در محاسبات سود و کارمزد، **نتیجه به پایین گرد میشود.** ترتیب پارامترها در دستورات **آزاد** است و **میتوانند به هر ترتیبی وارد شوند.** فرمت زمان به صورت `yyyy-mm-dd-hh:mm` است (مثال: `2025-06-15-14:30`). **حداکثر تعداد کاربران ۱۰۰۰، حداکثر تعداد کیف پولها ۵۰۰۰، حداکثر تعداد صندوقها ۱۰۰ و حداکثر تعداد تراکنشها ۵۰,۰۰۰ است. رعایت اصول شیگرایی و کد تمیز در پیادهسازی مهم است.**
# **ورودی**
سطر اول ورودی شامل **یک عدد صحیح و مثبت** $n$ است که **تعداد دستورهای ورودی** را نشان میدهد.
$$1 \le n \le 100$$
در $n$ **سطر بعدی ورودی،** هر سطر شامل **یکی از دستورهای ذکر شده است.**
# **خروجی**
خروجیهای خواسته شده برای هر دستور را به ترتیب چاپ کنید.
# **مثال ورودی و خروجی**
### **ورودی نمونه ۱**
```bash terminal terminal
12
REGISTER --user U001 --name AliRezaei --national-id 1234567890
CREATE_WALLET --user U001 --wallet W001 --type SAVINGS
CREATE_WALLET --user U001 --wallet W002 --type INVEST
DEPOSIT --wallet U001_main --amount 10000000 --time 2025-06-01-10:00
TRANSFER --from U001_main --to W002 --amount 5000000 --time 2025-06-01-10:30
CREATE_FUND --fund F001 --name GrowthFund --rate 18 --min 1000000 --capacity 1000000000
INVEST --wallet W002 --fund F001 --amount 4000000 --time 2025-06-01-11:00
PORTFOLIO --wallet W002 --time 2025-06-15-11:00
SELL --wallet W002 --fund F001 --time 2025-06-15-12:00
BALANCE --wallet W002
HISTORY --wallet W002
DAILY_REPORT --date 2025-06-01
```
### **خروجی نمونه ۱**
```bash terminal terminal
User U001 registered successfully with main wallet
Wallet W001 of type SAVINGS created for user U001
Wallet W002 of type INVEST created for user U001
Deposited 10000000 to wallet U001_main. New balance: 10000000
Transferred 5000000 from U001_main to W002
Fund F001 created: GrowthFund with 18% annual rate
Invested 4000000 from wallet W002 in fund F001
Portfolio for wallet W002:
| Fund | Principal | Current Value | Profit |
| F001 | 4000000 | 4027616 | 27616 |
Total Value: 4027616
Sold investment in fund F001. Principal: 4000000, Profit: 27616, Total: 4027616
Wallet W002 (INVEST): 5027616
Transaction History for Wallet W002:
| 2025-06-01-10:30 | TRANSFER_IN | 5000000 | 5000000 | from:U001_main |
| 2025-06-01-11:00 | INVEST | 4000000 | 1000000 | fund:F001 |
| 2025-06-15-12:00 | SELL | 4027616 | 5027616 | fund:F001 |
Daily Report for 2025-06-01:
Total Deposits: 10000000 (1 transactions)
Total Withdrawals: 0 (0 transactions)
Total Transfers: 5000000 (1 transactions)
Total Investments: 4000000 (1 transactions)
Total Fees Collected: 0
Active Users: 1
```
### **ورودی نمونه ۲**
```bash terminal terminal
10
REGISTER --user U001 --name AliAhmadi --national-id 1111111111
REGISTER --user U002 --name SaraMohammadi --national-id 2222222222
CREATE_WALLET --user U002 --wallet W002 --type MAIN
DEPOSIT --wallet U001_main --amount 100000000 --time 2025-07-01-09:00
TRANSFER --from U001_main --to W002 --amount 60000000 --time 2025-07-01-09:15
TRANSFER --from U001_main --to W002 --amount 20000000 --time 2025-07-01-09:20
BALANCE --wallet U001_main
BALANCE --wallet W002
SUSPICIOUS --user U001 --date 2025-07-01
DAILY_REPORT --date 2025-07-01
```
### **خروجی نمونه ۲**
```bash terminal terminal
User U001 registered successfully with main wallet
User U002 registered successfully with main wallet
Wallet W002 of type MAIN created for user U002
Deposited 100000000 to wallet U001_main. New balance: 100000000
Transferred 60000000 from U001_main to W002. Fee: 300000
Transferred 20000000 from U001_main to W002. Fee: 100000
Wallet U001_main (MAIN): 19600000
Wallet W002 (MAIN): 79600000
Suspicious Activity for User U001 on 2025-07-01:
| 09:15 | U001_main | TRANSFER_OUT | 60000000 | LARGE_AMOUNT |
Daily Report for 2025-07-01:
Total Deposits: 100000000 (1 transactions)
Total Withdrawals: 0 (0 transactions)
Total Transfers: 80000000 (2 transactions)
Total Investments: 0 (0 transactions)
Total Fees Collected: 400000
Active Users: 2
```
- **در مثال دوم،** انتقال وجه بین دو کاربر مختلف انجام شده است، **بنابراین کارمزد ۰.۵ درصد** از مبلغ انتقال کسر شده است. **همچنین تراکنش ۶۰ میلیون تومانی** به عنوان **فعالیت مشکوک** با دلیل `LARGE_AMOUNT` شناسایی شده است!