У меня наконец-то дошли руки до этой задачи!
Но столкнулся с проблемами (WA) при реализации дерева отрезков в виде:
- за O(logN) на отрезке прибавлять +-1
- за O(logN) возвращать максимум на всём массиве и его номер.
При замене дерева на линейное прибавление TL на больших тестах, т.е. ошибка в дереве отрезков.
Вот функция обновления(t - массив прибавлений, tmax - максимум на подотрезке, wmax - где находится текущий максимум на подотрезке):
void update(int v,int tL,int tR,int l,int r,int add){
if (l>r) return;
if (tR==tL|(tL==l&tR==r)) {t[v]+=add;tmax[v]+=add;return;}
int tM=(tL+tR)/2;
update(v*2,tL,tM,l,min(r,tM),add);
update(v*2+1,tM+1,tR,max(l,tM+1),r,add);
tmax[v]=-99999999;
if (tmax[v]<tmax[v*2+1]) {tmax[v]=tmax[v*2+1]+t[v];wmax[v]=wmax[v*2+1];}
if (tmax[v]<tmax[v*2]) {tmax[v]=tmax[v*2]+t[v];wmax[v]=wmax[v*2];}
}
Весь код: http://pastebin.com/JQbFsGCD
UPD:Игнор