+ محدودیت زمان: ۳ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
حسنی برای این که در تابستان وقتش را تلف نکند به کسب و کار روی آورده و به تازگی بانکی به نام **کناب** تاسیس کرده است.
از آنجایی که دوست دارد شما نیز عضو کناب باشید به شما یک پروژه داده و خواسته تا همراهبانکی بنویسید که درخواستهای زیر را اجرا کند.
```
1 ip:username
```
این درخواست یعنی کاربری با نام کاربری *username* و آیپی *ip* به همراهبانک وصل شد و در صورتی که *username* معتبر نباشد باید عبارت `invalid username` را چاپ کنید.
**به یک نام کاربری معتبر میگوییم اگر فقط از حروف کوچک و بزرگ انگلیسی و اعداد تشکیل شده باشد.**
برای مثال `1aAB2` معتبر است ولی `ab*2` معتبر نیست.
```
2 ip:username:money
```
این درخواست یعنی کاربری با آیپی *ip* به حسابی با نام کاربری *username* به اندازه *money* پول ریخته است. در واقع باید از حساب *ip* به اندازه *money* کم کنید و به حساب *username* اضافه کنید.
```
3 ip
```
با داده شدن این درخواست مقدار پول داخل حساب فرد با آیپی *ip* را نمایش دهید.
**(دقت کنید که پول هر فرد میتواند منفی هم بشود و هرکس در ابتدا ۰ واحد پول دارد)**
# ورودی
در اولین خط ورودی عدد $q$ که بیانگر تعداد درخواستها است به شما داده میشود و در $q$ خط بعد، در هر خط یک درخواست داده میشود.
در هر درخواست ابتدا *type* داده میشود که برابر یکی از اعداد ۱ یا ۲ یا ۳ است و اگر $type$ برابر با ۱ باشد در ادامه دو رشته *ip* و *username* به شما داده میشود که توسط کاراکتر `:` از هم جدا شدهاند. اگر
$type$
مساوی ۲ باشد سه رشته *ip* و *username* و
*money*
داده میشود که با `:` از هم جدا شدهاند و اگر هم $type$ مساوی ۳ باشد رشته *ip* داده میشود.
$$0 \le q,money \le 100\ 000$$
طول *username* و *ip* حداکثر ۱۵ است.
تضمین میشود که:
+ یک کاربر دوبار به همراه بانک وصل نمیشود و آیپی و نام کاربری هیچ دو فردی یکسان نیست.
+ در صورتی که نام کاربری معتبر نباشد تنها ممکن است کاراکترهای `_` یا `*` یا `#` یا `$` در آن به کار رفته باشد.
+ همهی ورودیهای نوع ۲ و ۳ معتبر هستند؛ یعنی کاربری با آیپی یا نام کاربری مشخص شده، وجود دارد.
+ همه *ip*ها به صورت ۴ عدد بین ۰ تا ۲۵۵ هستند که با نقطه از هم جدا شدهاند.
+ حداکثر پولی که یک نفر میتواند داشته باشد $10^9$ است.
# خروجی
برای هر درخواست نوع ۱ در صورتی که *username* معتبر نیست باید عبارت `invalid username` را چاپ کنید و برای هر درخواست نوع ۳ باید مقدار پول حساب فرد خواسته شده را چاپ کنید. (پاسخ هر درخواست را در یک خط جدید چاپ کنید.)
# مثال
## ورودی نمونه
```
9
1 46.51.16.72:SmsS
1 192.168.10.13:#hacker$user
1 131.41.61.213:faeila
2 46.51.16.72:faeila:1000
3 46.51.16.72
3 131.41.61.213
2 131.41.61.213:SmsS:500
3 46.51.16.72
3 131.41.61.213
```
## خروجی نمونه
```
invalid username
-1000
1000
-500
500
```
توضیحات:
- نام کاربری `#hacker$user` معتبر نیست برای همین باید `invalid username` خروجی بدهید.
- از حساب `SmsS` هزار واحد پول کم میشود و به حساب `faeila` اضافه میشود و حالا `SmsS` منفی هزار و `faeila` هزار واحد پول دارد.
- از حساب `faeila` پانصد واحد کم میشود و حالا پانصد واحد پول دارد و `SmsS` منفی پانصد.
---------------------------------
<details class="blue">
<summary>
راهنمایی ۱
</summary>
برای پیادهسازی تمیز این سوال میتوانید از [Regex](https://en.wikipedia.org/wiki/Regular_expression) یا [عبارت باقاعده](https://fa.wikipedia.org/wiki/%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA_%D8%A8%D8%A7%D9%82%D8%A7%D8%B9%D8%AF%D9%87) و [Associative array](https://en.wikipedia.org/wiki/Associative_array) یا [آرایه انجمنی](https://fa.wikipedia.org/wiki/%D8%A2%D8%B1%D8%A7%DB%8C%D9%87_%D8%A7%D9%86%D8%AC%D9%85%D9%86%DB%8C) استفاده کنید.
میتوانید [این لینک](https://en.wikipedia.org/wiki/Comparison_of_programming_languages_%28associative_array%29#C++) را نیز برای پیدا کردن *Associative array* در زبان مورد نظرتان استفاده کنید.
</details>
<details class="blue">
<summary>
راهنمایی ۲
</summary>
سعید کنید *Associative array*ای بسازید که هر کاربر که اضافه شد، بتوان با استفاده از نامکاربری هر فرد، آیپی آن فرد را پیدا کرد.
</details>
<details class="blue">
<summary>
راهنمایی ۳
</summary>
حالا *Associative array* دیگری بسازید که با استفاده از آیپی هر فرد بتوان موجودی حساب آن فرد را پیدا کرد و یا تغییر داد.
</details>
<details class="blue">
<summary>
راه حل
</summary>
حالا میتوانید با استفاده از آیپی یا نامکاربری به موجودی حساب هر فرد دسترسی داشته باشید و درخواستها را انجام بدهید.
فرض کنید `sender_ip` برابر آیپی فردی است که پول واریز میکند و `receiver_user` برابر نام کاربری فردی است که پول دریافت میکند. میخواهیم دو مقدار `receiver_money` را که برابر پول حساب دریافت کننده است و همچنین `sender_user` و `sender_money` که نام کاربری و پول حساب واریز کننده است را پیدا کنیم.
و دو *Associative array* به نامهای `get_user` و `get_money` داریم که با اولی میتوان با دادن آیپی فرد نام کاربری آن را به دست آورد و با استفاده از دومی، با دادن نام کاربری فرد، مقدار پول حسابش را به دست آورد.
شبه کد الگوریتم برای اعمال کوئریهای نوع اول:
```
ip = input ip address
user = input username
if user is valid :
add {user, 0} to get_money
add {ip, user} to get_user
```
شبه کد الگوریتم برای اعمال کوئریهای نوع دوم:
```
sender_ip = sender ip address
receiver_user = receiver username
sender_user = get username from get_user
reassign value of (money of sender_user) in get_money by specific value
reassign value of (money of receiver_user) in get_money by specific value
```
</details>
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.