sum = 0;
last = 0;
// indicii head si tail ai dequeului
head = tail = 1;
// poziţia lui bst[0] se inserează în deque
deque[1] = 0;
deque[head = tail = 1] = 0;
pentru i = 1, N execută
sum += S[i];
temp = bst[ deque[tail] ];
cât timp (head <= tail) şi (S[ deque[tail] ] <= S[i]) execută
cât timp (head <= tail) şi S[ deque[tail] ] <= S[i] execută
temp = Min(temp, iMin[tail]);
tail --;
sfârşit;
sfcâttimp
// adaug poziţia i la deque
tail ++;
deque[tail] = i;
// actualizez iMin[]
iMin[tail] = temp;
// actualizez T[], arborele de intervale de deque[]
// actualizez T[]
update(T, tail, iMin[tail] + S[i]);
// suma valorilor din [last, i] trebuie să nu depăşească M
cât timp (head <= tail) şi (sum > M) execută
sum -= S[last];
dacă (deque[head] == last) atunci
head ++;
sfârşit;
sfdacă
last ++;
sfârşit;
// actualizez iMin[], Tb[] arborele de intervale pe bst[]
iMin[head] = query(Tb, last - 1, deque[head] - 1);
sfcâttimp
// actualizez iMin[]
iMin[head] = query(bst, last - 1, deque[head] - 1);
// actualizez T[]
update(T, head, iMin[head] + S[ deque[head] ]);
// reţin optimul pentru poziţia curentă
bst[i] = query(T, head, tail);
// actualizez Tb[]
update(Tb, i, bst[i]);
sfârşit;
sfpentru
scrie bst[N];
Sfârşit.
==