Автор Gassa, история, 3 дня назад, По-русски,

Всем привет!

Приглашаю вас поучаствовать в Codeforces Marathon Round 2. Это соревнование начнётся во вторник, 24 июля 2018 года в 15:00 MSK, и продлится 7 дней. В соревновании будет одна задача, основанная на механике пары детских настольных игр. Скорее всего, задача не имеет быстрого полного решения. Так что решения будут оцениваться баллами, и победит тот, кто наберёт больше всего баллов.

Соревнование будет нерейтинговым, поскольку задача существенно отличается от задач рейтинговых раундов.

В основное время решения будут тестироваться на примерах и на предварительных тестах. После окончания итоговое решение каждого участника будет перетестировано на итоговом наборе тестов, и баллы в этом тестировании определят итоговую таблицу результатов. Соревнование пройдёт на платформе Codeforces при поддержке кружка обучения мастерству программирования при СПбГУ и 90.01 Group.

На Codeforces пока проведено не так уж много марафонов. Так что, если что-то сломается — не расстраивайтесь, а напишите об этом, мы постараемся всё исправить.

Успехов в соревновании!

Полный текст »

  • Проголосовать: нравится  
  • +179
  • Проголосовать: не нравится  

Автор MikeMirzayanov, 42 часа назад, По-русски,

Hello, Codeforces.

This is a short blog to introduce you recent updates in Testlib and Polygon.


Generate a Permutation

Now, you can easily generate a permutation with codes like this:

Code Result
vector<int> p = rnd.perm(n); Generates 0-indexed permutation of size n
vector<int> p = rnd.perm(n, 1); Generates 1-indexed permutation of size n

Function println

Now, you can easily print space-separated lines in a generator. A println uses cout, thus prefer faster method if you print huge data.

Some examples:

Code Result
println(5); Print 5 and line break
println(1, 2, 3); Print 1 2 3 (three space separated integers) and line break
println("one", "more", 5.5); Print one more 5.5 (three space separated items) and line break
vector<int> a; ...; println(a); Print vector a (separate elements with spaces) and line break
vector<int> a; ...; println(a.begin(), a.end()); Exactly the same as above
string b[5]; ...; println(b, b + 5); Print array b (separate elements with spaces) and line break

Here is the example of a generator to print a permutation:

#include "testlib.h"

using namespace std;

int main(int argc, char* argv[]) {
    registerGen(argc, argv, 1);
    int n = atoi(argv[1]);
    println(rnd.perm(n, 1));

Function readInts and similar

Just as a reminder. Use functions readInts/readLongs/readStrictDoubles or readTokens/readLines in a validator to read and validate a sequence of values. To read a size of an array and array itself, use:

int n = inf.readInt(1, 200000, "n");
inf.readInts(n, 1, 1000000, "a");


Example Problems

I've introduced three example problems. Each Polygon user has READ-access to them. Please, use them as examples how to write a problem in Polygon. They are:

  • example-a-plus-b: simple A+B problem
  • example-almost-upper-bound: simple problem to illustrate non-standard checker (always consider to use readAnswer function like in the example), generators and stress tests
  • example-interactive-binary-search: simple interactive problem on a binary search

Other Small Fixes

  • Allow to upload files (for example, images) as a contest property/file to use them in the statements.ftl. File names should start with 'statements-'.
  • API has been improved to support general description, general tutorial, tags, test groups and points.
  • Show problem ID on the summary box (on the righmost top block).
  • Replace UTF-8 typographic characters to their ASCII equivalent (for example, replace em dash — with ---).
  • Caching issue has been fixed. Previously, it could show RJ on tests even if the reason has been fixed.

Thanks to fcspartakm for implementing most features in Polygon.

Полный текст »

  • Проголосовать: нравится  
  • +242
  • Проголосовать: не нравится  

Автор Chilli, история, 3 дня назад, По-английски,


The Policy Hash Table has 3-6x faster insertion/deletion and 4-10x increase for writes/reads. As far as I can tell, there are no downsides. The policy hash table (specifically the open-addressing version), beats out unordered_map in all my benchmarks.


I've often been irritated by how slow unordered_map is in C++. Too often, I have something that runs fast enough in terms of complexity, but the constant factor from unordered_map slows down the solution too much. Yesterday though, after using the useful order statistics tree from https://codeforces.com/blog/entry/11080, I was curious if there were any other useful data structures hiding in the Policy STL. And lo and behold, I found a hash table.


Well, enough backstory, let's look at some numbers. All benchmarks below are compiled with C++14 -O2.

unordered_maplinear insertion:                                  0.689846
cc_hash_tablelinear insertion:                                  0.408233
gp_hash_tablelinear insertion:                                  0.256131

unordered_maplinear read/write:                                 1.69783
cc_hash_tablelinear read/write:                                 0.202474
gp_hash_tablelinear read/write:                                 0.26842

unordered_maprandom insertion:                                  2.90184
cc_hash_tablerandom insertion:                                  3.15129
gp_hash_tablerandom insertion:                                  0.56553

unordered_maprandom read/write:                                 2.02336
cc_hash_tablerandom read/write:                                 0.333415
gp_hash_tablerandom read/write:                                 0.403486

While for linear insertions, the policy hash table gives modest improvements, the policy hash table blows the unordered_map out of the water when it comes to reads/writes. These are order of magnitude improvements that make hash tables usable when they previously weren't. "Official" benchmarks done by the DS authors can also be found here


Benchmarks of course, don't always reflect the real world. So here's an example of it allowing a solution to be accepted that TLE's with unordered_map.

Example problem (5000 ms time limit)
Solution with unordered_map: (TLE on test case 8)
Solution with policy hash table directly substituted in: (TLE on test case 26)
Solution with unordered_map, rewritten to not use clears: (TLE on test case 26)
Solution with policy hash table and rewritten to not use clears: (AC with max time of 3180 ms)


To use this data structure:

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
gp_hash_table<int, int> table;

From there, the API seems almost exactly the same.

Defeating Anti-Hash tests

One weakness of hash tables is that mean people can find hash collisions offline and blow up the complexity of your hashmap. In my opinion, the easiest way of solving this is below. There's no need to define your own custom hash function.

const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count();
struct chash {
    int operator()(int x) { return hash<int>{}(x ^ RANDOM); }
gp_hash_table<key, int, chash> table;

Why is it so much faster?

See my comment here

A better hash function

There is one issue with using policy hash tables as is. The default hash function for numerics in C++ is just the identity. This is especially problematic for using hash tables for something like a fenwick tree, especially since the default bucket structure for policy_hash_tables is based of powers of 2 and not primes. If you're using policy hash tables for fenwick trees, you have 2 options. 1. Choose to use prime table sizes, as done here. 2. Choose a better hash function for integers, as done here.

Thanks to adamant for his post that revealed to me the existence of policy data structures, and thanks to ed1d1a8d for the discussion.

PS: In other posts for unordered_map, I've seen people claim that reserve and max_load_factor could increase performance drastically. They didn't seem to do much for me. However, if you want to do something similar for these hash tables, check out the example here

Code for the benchmarks can be found here

EDIT: I realized that gp_hash_table is the way to go, not cc_hash_table. gp_hash_table sacrifices ~10% reading/writing speed to gain 3-6x in insertion/deletion/clearing. I updated the post to reflect the new numbers.

Полный текст »

  • Проголосовать: нравится  
  • +229
  • Проголосовать: не нравится  

Автор Vovuh, история, 9 дней назад, По-русски,


Окончательно освободившись от большей части летних забот, я снова могу приступить к подготовке Div. 3 раундов! Я решил добавить в этот блог что-то от себя, потому что TryToKnowMe (и, думаю, многие другие) заметили, что я правда копирую эту запись от раунда к раунду, меняя лишь название соревнования и дату проведения. Но кто знает, может, экономя время на написании анонса, я успеваю лучше подготовить задачи к раунду?... Пусть это останется тайной. А теперь приступим.

В 16.07.2018 17:35 (Московское время) начнётся Codeforces Round #498 (Div. 3) — очередной Codeforces раунд для третьего дивизиона. В этом раунде будет 6 задач, которые подобраны по сложности так, чтобы составить интересное соревнование для участников с рейтингами до 1600. Наверное, участникам из первого дивизиона они будут совсем не интересны, а для 1600-1899 покажутся простыми. Однако все желающие, чей рейтинг 1600 и выше могут зарегистрироваться на раунд вне конкурса.

Раунд пройдет по правилам образовательных раундов. Таким образом, во время раунда задачи будут тестироваться на предварительных тестах, а после раунда будет 12-ти часовая фаза открытых взломов. Я постарался сделать приличные тесты — так же как и вы буду расстроен, если у многих попадают решения после окончания контеста.

Вам будет предложено 6 задач и 2 часа на их решение.

Штраф за неверную попытку в этом раунде (и последующих Div. 3 раундах) будет равняться 10 минутам.

Напоминаем, что в таблицу официальных результатов попадут только достоверные участники третьего дивизиона. Как написано по ссылке — это вынужденная мера для борьбы с неспортивным поведением. Для квалификации в качестве достоверного участника третьего дивизиона надо:

  • принять участие не менее чем в двух рейтинговых раундах (и решить в каждом из них хотя бы одну задачу),
  • не иметь в рейтинге точку 1900 или выше.

Независимо от того являетесь вы достоверными участниками третьего дивизиона или нет, если ваш рейтинг менее 1600, то раунд для вас будет рейтинговым.

Спасибо MikeMirzayanov за платформы, помощь с идеями для задач и координацию моей работы. Спасибо моим очень хорошим друзьям Михаилу PikMike Пикляеву, Максиму Ne0n25 Мещерякову и Ивану BledDest Андросову за помощь в подготовке и тестирование раунда.


UPD: Также большое спасибо тестерам uwi, mareksom и ivan100sic за неоценимую помощь в подготовке раунда!

UPD2: Таблица результатов!

Поздравляем победителей:

Rank Competitor Problems Solved Penalty
1 HighPressure 6 236
2 LividFox 6 237
3 Rzuji 6 265
4 Syvail 6 273
5 khadgar1998 6 279

Поздравляем лучших взломщиков:

Rank Competitor Hack Count
1 jhonber 131:-7
2 antguz 9
3 ducdien2267 9:-3
4 djm03178 6:-1
5 imlk 4

Всего было сделано 199 успешных взломов и 232 неудачных взлома!

И, наконец, поздравляем людей, отправивших первое полное решение по задаче:

Problem Competitor Penalty
A eggmath 0:01
B eggmath 0:06
C thidailoc 0:07
D MoreThanANoob 0:23
E Student_of_Husayn 0:07
F NoTrolleNoLife 0:18

UPD3: Разбор опубликован.

Полный текст »

  • Проголосовать: нравится  
  • +195
  • Проголосовать: не нравится  

Автор MikhailRubinchik.ru, 9 дней назад, По-русски,

Всем привет!

Все лагеря по олимпиадной информатике (которые нам известны) делятся на три группы:

  1. Региональные (доступны для школьников только какого-то конкретного региона)

  2. Коммерческие (берут всех, но лагеря довольно дорогие)

  3. С отбором (они для школьников из любого региона, но чтобы в них попасть, нужно решить определенное количество задач во вступительной работе)

А часто бывает, что лагерь сразу попадает и во 2-ю и в 3-ю категорию.

Это создаёт ситуацию, когда в регионах без собственного лагеря (а таких большинство) школьник c маленьким опытом участия в олимпиадах может поехать только в коммерческий дорогой лагерь. Организаторов любого вида таких лагерей можно понять. Если вы проводите лагерь, то не хотите работать в ноль или в минус. А если работаете в ноль или минус, то хотите брать в свой лагерь только лучших. Ну либо вы работаете на развитие своего региона.

Но все-таки мы (сообщество студентов и выпускников УрФУ) считаем, что такая ситуация несправедлива. И хотим её менять! Весь последний учебный год мы проводим свои лагеря для школьников Свердловской области. Позади пять таких лагерей, а скоро пройдут еще два.

Теперь мы решили помогать школьникам и из других регионов и в августе делаем первый лагерь, открытый для всех регионов. Наша позиция: если спрос большой, надо расширять лагерь, а не устраивать отбор или повышать цену!

С 21 августа по 7 сентября мы проводим лагерь, на который нет отбора, в нем могут участвовать все желающие, и при этом он достаточно дешёвый. По уровню школьники делятся на группы по итогу первых двух учебных дней. В самой слабой группе будут школьники, которые не умеют программировать и не крутые математики. Самая сильная будет уровня призёров региона/выхода на всеросс.

В стоимость 29 000 рублей входит проживание, питание, трансфер из Екатеринбурга и назад. Поскольку смена проходит в санатории, в цену путевки включена профилактическая медицина, на которую мы заложили время в расписании: массажи, лечебные ванны, грязи и т.д. Конечно, в цену лагеря входит и учёба.

Цена (в пересчёте на день) чуть выше наших региональных смен, так как нет субсидий региона, но мы всё равно привлекаем спонсорские деньги и тратим свои, поэтому наша цена ниже всех остальных лагерей и примерно в 2 раза ниже всех лагерей без отбора.

Всего в лагере 105 мест, и 60 путевок уже распределено, то есть осталось 45 мест. Если вы не попали в дорогие лагеря или лагеря с отбором, но при этом есть время и желание круто прокачаться в олимпиадной информатике, мы вас ждем у нас.


Ссылка на регистрацию: goo.gl/HJjffM

Немного про учёбу: goo.gl/UKQA8G

Немного про неучёбу: goo.gl/zzmQnD

Полный текст »

  • Проголосовать: нравится  
  • +75
  • Проголосовать: не нравится  

Автор PikMike, история, 10 дней назад, По-русски,

Привет, Codeforces!

Друзья, в такой замечательный день недели, как 14.07.2018 17:35 (Московское время) состоится Educational Codeforces Round 47.

Продолжается серия образовательных раундов в рамках инициативы Harbour.Space University! Подробности о сотрудничестве Harbour.Space University и Codeforces можно прочитать в посте.

Этот раунд будет рейтинговым для участников с рейтингом менее 2100. Соревнование будет проводиться по немного расширенным правилам ACM ICPC. После окончания раунда будет период времени длительностью в 12 часов, в течение которого вы можете попробовать взломать абсолютно любое решение (в том числе свое). Причем исходный код будет предоставлен не только для чтения, но и для копирования.

Вам будет предложено 7 задач на 2 часа. Мы надеемся, что вам они покажутся интересными.

Задачи вместе со мной придумывали и готовили Иван BledDest Андросов, Владимир Vovuh Петров, Максим Ne0n25 Мещеряков и Аслан ag2cidk Тамаев.

Удачи в раунде! Успешных решений!

Также есть сообщение от наших партнеров, Harbour.Space University:

Hi Codeforces!

We want to remind everyone that the Hello Barcelona Programming Bootcamp is right around the corner, and we’d love to see you there!

Our boot camp will once again feature the all-time greats Mike MikeMirzayanov Mirzayanov, Andrey andrewzta Stankevich, Michael Endagorion Tikhomirov, Gleb GlebsHP Evstropov, Artem VArtem Vasilyev, Ivan ifsmirnov Smirnov and other world renowned Russian coaches to train the participants.

We would also like to extend a welcome to some of the newest teams to join us from Colorado School of Mines, University of British Columbia and Reykjavík University.

Be sure to register before August 1st so everyone has time to get visas if needed, and of course for the Early Bird Discount of 15% or the Loyalty Discount* of 20% off registration for the boot camp!

*The loyalty discount is offered to universities and individual participants that took part in Hello Barcelona Bootcamps and Moscow Workshops ICPC.

Learn more about Barcelona ICPC Bootcamp

You can ask any questions by email: hello@harbour.space

Поздравляем победителей:

Место Участник Задач решено Штраф
1 e-pluszak 7 159
2 hohomu 7 274
3 guille 7 338
4 radoslav11 7 580
5 waynetuinfor 6 148

Поздравляем лучших взломщиков:

Место Участник Число взломов
1 halyavin 689:-132
2 2014CAIS01 91:-13
3 Marcel_Ib 20:-1
4 Ali_Pi 16:-3
5 20180616sG 15:-3
Было сделано 978 успешных и 798 неудачных взломов.

И, наконец, поздравляем людей, отправивших первое полное решение по задаче:

Задача Участник Штраф
A AuroraGarden 0:01
B eddy1021 0:05
C e-pluszak 0:09
D hmc 0:09
E Roundgod 0:19
F radoslav11 0:15
G chemthan 0:28

UPD: Разбор опубликован

Полный текст »

  • Проголосовать: нравится  
  • +173
  • Проголосовать: не нравится  

Автор SirShokoladina, история, 2 недели назад, По-русски,

Всем привет!

Мы дэт-метал группа Skyglow, недавно у нас вышел первый альбом. И поскольку мы по совместительству являмся спортивными программистами, мы решили провести в честь этого раунд на Codeforces!

Раунд состоится в 13.07.2018 17:35 (Московское время). В каждом дивизионе будет по пять задач, три из них будут совпадать. Задачи составлены мной и SirRembocodina, также контест помогали подготовить TeaPot, GrumpyKitten, mingaleg и niyaznigmatul. Благодарим demon1999 и winger за прорешивание, нашего координатора arsijo и, конечно, MikeMirzayanov за предоставление площадок Codeforces и Polygon.

Послушать альбом можно по ссылке:

Вы очень поможете нам, если репостните нас, даже если сами вы такую музыку не слушаете.

Всем участникам контеста, изъявившим желание, мы подарим альбом на CD диске. (Если таких окажется много, то мы выберем из них нескольких лучших по результату раунда). Обращайтесь ко мне в личные сообщения.

Удачи на контесте!

UPD1. мы подарим наш альбом на CD диске лучшим 10 участникам, которые хотели бы его получить. Чтобы поучаствовать в розыгрыше, напишите мне личное сообщение до контеста с вашим адресом, индексом и полным именем.

UPD2. Разбаловка выглядит следующим образом:
Div2: 500-1000-1500-2000-2500
Div1: 500-1000-1500-2250-2500

UPD3. Мы всё ещё думаем, нужно ли делать раунд рейтинговым или нет. Вы можете поделиться своим мнением в блоге Майка.

UPD4. Мы решили отсортировать пользователей по изменению рейтинга, так что следующие участники получат диск:
riela, +332
DongwonShin, +278
Erdenebayar, +176
DOlaBMOon, +148
Muhimin_Osim, +121
ciphereck, +117
Oliveira_medalha_de_ouro, +104
luismo, +94
zubec, +72
yagyanshbhatia, +70

UPD5. Поздравляем победителей!


  1. yosupo
  2. Egor
  3. fateice
  4. Um_nik
  5. ksun48
  6. wxh010910
  7. zemen
  8. 768092
  9. mareksom
  10. mmaxio


  1. riela
  2. Kato_Megumi
  3. luis.trivelatto
  4. yukuai26
  5. Ddaji
  6. gls1196
  7. TaoSama
  8. chenyuqi0215
  9. CongLingDanPaiShang3k5
  10. Rena_Takeda

UPD6. Опубликован разбор!

Полный текст »

  • Проголосовать: нравится  
  • +859
  • Проголосовать: не нравится  

Автор MikeMirzayanov, 2 недели назад, По-английски,


This time decided to fill myself in the shoes of the problem writers. It is very exciting! My challenge was to prepare a round in one day. It's really incredible pleasure to surrender to my passion and all day just work on problems!

Despite the fact that in total I've wrote 8 problems, I made it in time. Initially, I prepared 7 problems, but two of them were found to be used before (thank you, 300iq and _kun_ for poining it) and I removed them and wrote a new problem.

Codeforces Round #496 (Div. 3) will start on Jul/09/2018 18:35 (Moscow time). You will be offered 6 problems with expected difficulties to compose an interesting competition for participants with ratings up to 1600. Probably, participants from the Div. 1 not be at all interested by this problems. And for 1600-1899 the problems will be quite easy. However, all of you who wish to take part and have rating 1600 or higher, can register for the round unofficially.

The round will be hosted by rules of educational rounds (extended ACM-ICPC). Thus, during the round, solutions will be judged on preliminary tests, and after the round it will be a 12-hour phase of open hacks. I tried to make strong tests — just like you will be upset if many solutions fail after the contest is over.

You will be given 6 problems and 2 hours to solve them.

Remember that only the trusted participants of the third division will be included in the official standings table. As it is written by link, this is a compulsory measure for combating unsporting behavior. To qualify as a trusted participants of the third division, you must:

  • take part in at least two rated rounds (and solve at least one problem in each of them),
  • do not have a point of 1900 or higher in the rating.

Regardless of whether you are a trusted participant of the third division or not, if your rating is less than 1600, then the round will be rated for you.

Many thanks to the testers: kevinsogo, 300iq, _kun_, arsijo and adedalic. You really helped to make this round!

Good luck!

UPD 1: The round is over. Thank you for participation!

Official Top-5 (trusted only)

Unofficial Top-5 (+ untrusted)

UPD 2: The editorial is available by the link.

Полный текст »

  • Проголосовать: нравится  
  • +263
  • Проголосовать: не нравится  

Автор Nickolas, 3 недели назад, По-английски,

Microsoft's Quantum Team and Codeforces are excited to invite you to Microsoft Q# Coding Contest — Summer 2018!

The contest will run from July 6 — 9 and will consist of increasingly challenging tasks on introductory topics in quantum computing: superposition, measurement, oracles and simple algorithms. The top 50 ranked participants will receive a Microsoft Quantum T-shirt!

As a reminder, last weekend we help a warmup round with easier tasks which covered the same topics. The results were quite impressive: 167 participants solved all tasks! You can see the tasks here, and the solutions with explanations here.

Several useful reminders:

  • The contest is unrated.
  • Solutions are accepted in Q# only.
  • Participants are ranked according to the number of correctly solved tasks, with penalty time as a tiebreaker.
  • The tasks are grouped by topic, and the tasks within one topic are ordered in approximate order of increasing difficulty. If you find a problem too hard, don't forget to check the next problems in this topic and problems from different topics, they might turn out to be easier.
  • Unlike the warmup round, you're not allowed to discuss the tasks during the contest.
  • By popular demand, we have added Custom Invocation to allow you to run Q# code on Codeforces servers. Here is the signature of the code you should use to run it (note that the namespace and operation name have to match this code exactly):
namespace Solution {
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;

    // ------------- Operation which is called from C# -------------------
    operation RunQsharp () : Bool
            return true;
  • For tasks which require you to create a certain quantum state or to implement a unitary transformation, any kind of error gives verdict "Wrong Answer". For tasks which have classical return, I tried to differentiate verdicts "Wrong Answer" (your return value was incorrect) and "Runtime Error" (array index out of bounds, qubits released are not in zero state, oracle called too many times etc.).
  • NO PURCHASE NECESSARY. Must be 16 years of age or older. Game ends 7/9/18. For details, see Official Rules.

You can find the discussion of the warmup round and pointers to Q#/quantum computing materials here.

For first time Codeforces users:

  1. Create user account here.
  2. Register for the contest here.
  3. Once the contest starts on July 6, access the problems here.

Good luck! We hope you enjoy the contest!

Update. The contest is over. Editorials are published.

Полный текст »

  • Проголосовать: нравится  
  • +97
  • Проголосовать: не нравится  

Автор arsijo, 3 недели назад, По-русски,

Всем привет!

Лето... Прекрасная пора для поездок на отдых, прогулок с друзьями, новых открытий и, конечно же, написания новых увлекательных контестов на Codeforces. Поэтому, я предлагаю к вашему вниманию мой новый Codeforces Round #495 (Div. 2) с интересными задачами и не менее интересными разборами, который состоится в 05.07.2018 19:35 (Московское время). Если ваш рейтинг меньше 2100, этот раунд будет для вас рейтинговым, иначе — вы можете участвовать вне конкурса.

Хочу поблагодарить Михаила MikeMirzayanov Мирзаянова за помощь в подготовке и за системы Codeforces и Polygon. Также Ильдара 300iq Гайнуллина, Дмитрия _kun_ Саютина, Даниила danya.smelskiy Смельского, Chin-Chia eddy1021 Hsu и Kevin ksun48 Sun за тестирование задач.

Вам будет представлено 6 задач и 2 часа на их решение. Разбалловка будет объявлена ближе к началу раунда.

В этом раунде вам предстоит помочь девочке Соне с ее ежедневными проблемами. Удачи вам в этом!

UPD. Разбалловка 500-1000-1500-2000-2500-3000.

UPD. Поздравляем победителей!!!!

Место Ник Баллы
1 EZ_fwtt08 7892
2 milisav 5550
3 VisJiao 5294
4 Jatana 4832
5 wasyl 4762

Полный текст »

  • Проголосовать: нравится  
  • +387
  • Проголосовать: не нравится