Прибавление и сумма

Нужно прибавлять на отрезке и находить сумму. Но у меня выводит ВА. Я понимаю, что там есть туториал где Павел пишет код, но я поддерживаю такой инвариант что когда мы вошли в вершину то ответ там уже посчитан правильно, т.е. пишу чуть-чуть по другому. И я не могу понять почему у меня ВА. Я попытался найти контрпример, но не смог. Прошу помочь.

мой код

1 лайк

Проверь свой push, он не правильный и еще в get и upd ты его запускаешь не в правильных местах.

2 лайка

Почему я делаю пуш неправильно? Если вершина частично входит в отрезок то я проталкиваю в детей пока не найдется отрезок который полностью находится в отрезке l r. Может я чего то не понимаю

1 лайк

Я подумал что это какой нибудь corner case но в листах я пуш не делаю. Можете объяснить что не так?

1 лайк
void push(int v, int tl, int tr){
	if(t[v].add == 0)
		return;
	int tm = (tl + tr) >> 1;
	t[v + v].add = t[v].add;
	t[v + v + 1].add = t[v].add;
	t[v + v].sum += 1LL * (tm - tl + 1) * t[v].add;
	t[v + v + 1].sum += 1LL * (tr - tm) * t[v].add;
	t[v].add = 0;
}

Ты когда закидываешь lazy propogation в сыновья присваиваешь, хотя должен добавлять.

И насчет пуша и его места оказывается все окей, я ошибся)

2 лайка

без комментариев

Спасибо большое!

2 лайка