Привет, Codeforces!
Прошу помощи с одной проблемой и объяснения, почему такое может происходить.
В общем я писал дерево отрезков сверху, чтобы добавлять число на отрезке 739C - Алёна и башни. После написания корректной программы я застрял на 4 тесте. После стресс теста (около 20000 тестов) я не смог найти ошибку.
После ещё двух часов я добавил перед кодом #define int long long
. Это помогло мне пройти 4 тест, но я получил TLE 47. Как вы могли понять я не понимал, почему это помогло. И так как я пишу это — я не понимаю до сих пор. После небольшого расследования я понял, что единственная разница в одном методе void add(int d)
. Вот коды: Wrong Answer 4 и Accepted. Единственное изменение — void add(int d)
теперь void add(long long d)
. Внутри функции все, что я делаю это:
void add(int d) {
p += d;
left += d;
right += d;
}
Все переменные p
, left
and right
типа long long, так что единственная разница в d
. Это разница означает что long long += int
работает не так, как я ожидал. Я всегда думал, что оно конвертирует int
в long long
и затем складывает. Кажется это не так.
Надеюсь кто-нибудь сможет мне помочь и объяснит, почему такое происходит. Еще хотел бы узнать, как вы справляетесь с проблемами типа переполнения на соревнованиях.
Заранее спасибо.
UPD: Проблема решена.
Difference is when you are trying to call add with parameter that doesn't fit in int. You have such calls in your code, check push method.
Oh god, thank you so much, I've spent too much time on it.