#pragma pack(1)
#include <iostream>
using namespace std;
const int maxn = 1e5;
struct Node { //узел дерева
Node *lp, *rp; //дочерние узлы / поддеревья
int val; //сумма (или другой параметр) для поддерева
};
Node nodes[maxn * 30]; //хранилище узлов, все узлы изначально нулевые (0,null_ptr,null_ptr)
Node* roots[maxn + 1];
Node* lastnode = nodes + 1; //первый из свободных узлов
int getsum(Node* v, int l, int r, int x, int y) { //найти сумму элементов от x-го до y-го
if (v == nullptr) return 0; //в поддереве начиная с узла (v,l,r)
if(l == x && r == y) {
return v -> val;
}
else {
int m = (l + r) / 2;
if(y <= m) {
return getsum(v -> lp, l, m, x, y);
}
else if(x > m) {
return getsum(v -> rp, m + 1, r, x, y);
}
else {
return getsum(v -> lp, l, m, x, m) + getsum(v -> rp, m + 1, r, m + 1, y);
}
}
}
void update(Node*& v, int l, int r, int pos, int val) {
//обновление элемента с позицией pos в поддереве (v,l,r) (присваивание значения val)
//при обновлении всегда создается новый узел
Node* old = v; //старый узел (не трогаем!)
v = lastnode++; //новый узел из хранилища
if(old != nullptr) { // если старый узел существовал
*v = *old; //копируем старый узел
} //иначе новый узел пуст (0,null_ptr,null_ptr)
if(l == r) { //и l==r==pos
v -> val = val;
}
else {
int m = (r + l) / 2;
if(pos <= m) {
update(v -> lp, l, m, pos, val);//обновление левого поддерева
}
else {
update(v -> rp, m + 1, r, pos, val);//обновление правого поддерева
}
v -> val = 0; //начало пересчета суммы
if(v -> lp != nullptr) //если левое поддерево существует
v -> val += v -> lp -> val; //учесть его сумму
if(v -> rp != nullptr)
v -> val += v -> rp -> val;
}
}
void print(Node* root) {
cout << root -> val << " ";
if(root -> lp != nullptr) {
print(root -> lp);
}
if(root -> rp != nullptr) {
print(root -> rp);
}
}
int main() {
const int N = 1e9;
int a[maxn]; //массив
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
} //ввели с клавиатуры
//roots[0] == null_ptr (пустое дерево)
for(int i = 1; i <= n; i++) {
roots[i] = roots[i - 1]; //новый корень указывает туда же, что и старый
update(roots[i], 1, N, i, a[i]); //обновляем дерево с новым корнем,
//при этом создается действительно новый корень и некоторые новые узлы
//корень имеет диапазон [1,N] и i-тому элементу присваивается значение a[i]
}
// cout << roots[2] -> val << endl;
for(int i = 1; i <= n; i++) {
cout << roots[i] -> val << " ";
}
cout << endl;
// print(roots[n]);
cout <<getsum(roots[2],1,N,2,3) <<endl; //какая была сумма от 2 до 3 в момент времени 2
roots[n+1] = roots[n]; //следующий момент времени n+1
update(roots[n+1], 1, N, 2, 0); //обнуляем второй элемент
cout <<getsum(roots[n],1,N,1,3) <<endl;
cout <<getsum(roots[n+1],1,N,1,3) <<endl;
return 0;
}
I3ByYWdtYSBwYWNrKDEpCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtYXhuID0gMWU1OwpzdHJ1Y3QgTm9kZSB7IC8v0YPQt9C10Lsg0LTQtdGA0LXQstCwCglOb2RlICpscCwgKnJwOyAvL9C00L7Rh9C10YDQvdC40LUg0YPQt9C70YsgLyDQv9C+0LTQtNC10YDQtdCy0YzRjwoJaW50IHZhbDsgLy/RgdGD0LzQvNCwICjQuNC70Lgg0LTRgNGD0LPQvtC5INC/0LDRgNCw0LzQtdGC0YApINC00LvRjyDQv9C+0LTQtNC10YDQtdCy0LAKfTsKCk5vZGUgbm9kZXNbbWF4biAqIDMwXTsgLy/RhdGA0LDQvdC40LvQuNGJ0LUg0YPQt9C70L7Qsiwg0LLRgdC1INGD0LfQu9GLINC40LfQvdCw0YfQsNC70YzQvdC+INC90YPQu9C10LLRi9C1ICgwLG51bGxfcHRyLG51bGxfcHRyKQpOb2RlKiByb290c1ttYXhuICsgMV07IApOb2RlKiBsYXN0bm9kZSA9IG5vZGVzICsgMTsgLy/Qv9C10YDQstGL0Lkg0LjQtyDRgdCy0L7QsdC+0LTQvdGL0YUg0YPQt9C70L7QsgoKaW50IGdldHN1bShOb2RlKiB2LCBpbnQgbCwgaW50IHIsIGludCB4LCBpbnQgeSkgeyAvL9C90LDQudGC0Lgg0YHRg9C80LzRgyDRjdC70LXQvNC10L3RgtC+0LIg0L7RgiB4LdCz0L4g0LTQviB5LdCz0L4KCWlmICh2ID09IG51bGxwdHIpIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvL9CyINC/0L7QtNC00LXRgNC10LLQtSDQvdCw0YfQuNC90LDRjyDRgSDRg9C30LvQsCAodixsLHIpCglpZihsID09IHggJiYgciA9PSB5KSB7CgkJcmV0dXJuIHYgLT4gdmFsOwoJfQoJZWxzZSB7CgkJaW50IG0gPSAobCArIHIpIC8gMjsKCQlpZih5IDw9IG0pIHsKCQkJcmV0dXJuIGdldHN1bSh2IC0+IGxwLCBsLCBtLCB4LCB5KTsKCQl9CgkJZWxzZSBpZih4ID4gbSkgewoJCQlyZXR1cm4gZ2V0c3VtKHYgLT4gcnAsIG0gKyAxLCByLCB4LCB5KTsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBnZXRzdW0odiAtPiBscCwgbCwgbSwgeCwgbSkgKyBnZXRzdW0odiAtPiBycCwgbSArIDEsIHIsIG0gKyAxLCB5KTsKCQl9Cgl9Cn0KCnZvaWQgdXBkYXRlKE5vZGUqJiB2LCBpbnQgbCwgaW50IHIsIGludCBwb3MsIGludCB2YWwpIHsgCgkvL9C+0LHQvdC+0LLQu9C10L3QuNC1INGN0LvQtdC80LXQvdGC0LAg0YEg0L/QvtC30LjRhtC40LXQuSBwb3Mg0LIg0L/QvtC00LTQtdGA0LXQstC1ICh2LGwscikgKNC/0YDQuNGB0LLQsNC40LLQsNC90LjQtSDQt9C90LDRh9C10L3QuNGPIHZhbCkKCS8v0L/RgNC4INC+0LHQvdC+0LLQu9C10L3QuNC4INCy0YHQtdCz0LTQsCDRgdC+0LfQtNCw0LXRgtGB0Y8g0L3QvtCy0YvQuSDRg9C30LXQuwoJTm9kZSogb2xkID0gdjsgLy/RgdGC0LDRgNGL0Lkg0YPQt9C10LsgKNC90LUg0YLRgNC+0LPQsNC10LwhKQoJdiA9IGxhc3Rub2RlKys7IC8v0L3QvtCy0YvQuSDRg9C30LXQuyDQuNC3INGF0YDQsNC90LjQu9C40YnQsAoJaWYob2xkICE9IG51bGxwdHIpIHsgLy8g0LXRgdC70Lgg0YHRgtCw0YDRi9C5INGD0LfQtdC7INGB0YPRidC10YHRgtCy0L7QstCw0LsKCQkqdiA9ICpvbGQ7IC8v0LrQvtC/0LjRgNGD0LXQvCDRgdGC0LDRgNGL0Lkg0YPQt9C10LsKCX0gLy/QuNC90LDRh9C1INC90L7QstGL0Lkg0YPQt9C10Lsg0L/Rg9GB0YIgKDAsbnVsbF9wdHIsbnVsbF9wdHIpCglpZihsID09IHIpIHsgLy/QuCBsPT1yPT1wb3MKCQl2IC0+IHZhbCA9IHZhbDsKCX0KCWVsc2UgewoJCWludCBtID0gKHIgKyBsKSAvIDI7CgkJaWYocG9zIDw9IG0pIHsKCQkJdXBkYXRlKHYgLT4gbHAsIGwsIG0sIHBvcywgdmFsKTsvL9C+0LHQvdC+0LLQu9C10L3QuNC1INC70LXQstC+0LPQviDQv9C+0LTQtNC10YDQtdCy0LAKCQl9CgkJZWxzZSB7CgkJCXVwZGF0ZSh2IC0+IHJwLCBtICsgMSwgciwgcG9zLCB2YWwpOy8v0L7QsdC90L7QstC70LXQvdC40LUg0L/RgNCw0LLQvtCz0L4g0L/QvtC00LTQtdGA0LXQstCwCgkJfQoJCXYgLT4gdmFsID0gMDsgLy/QvdCw0YfQsNC70L4g0L/QtdGA0LXRgdGH0LXRgtCwINGB0YPQvNC80YsKCQlpZih2IC0+IGxwICE9IG51bGxwdHIpIC8v0LXRgdC70Lgg0LvQtdCy0L7QtSDQv9C+0LTQtNC10YDQtdCy0L4g0YHRg9GJ0LXRgdGC0LLRg9C10YIKCQkJdiAtPiB2YWwgKz0gdiAtPiBscCAtPiB2YWw7IC8v0YPRh9C10YHRgtGMINC10LPQviDRgdGD0LzQvNGDCgkJaWYodiAtPiBycCAhPSBudWxscHRyKQoJCQl2IC0+IHZhbCArPSB2IC0+IHJwIC0+IHZhbDsKCX0KfQoKdm9pZCBwcmludChOb2RlKiByb290KSB7Cgljb3V0IDw8IHJvb3QgLT4gdmFsIDw8ICIgIjsKCWlmKHJvb3QgLT4gbHAgIT0gbnVsbHB0cikgewoJCXByaW50KHJvb3QgLT4gbHApOwoJfQoJaWYocm9vdCAtPiBycCAhPSBudWxscHRyKSB7CgkJcHJpbnQocm9vdCAtPiBycCk7Cgl9Cn0KCmludCBtYWluKCkgewoJY29uc3QgaW50IE4gPSAxZTk7CglpbnQgYVttYXhuXTsgLy/QvNCw0YHRgdC40LIKCWludCBuOwoJY2luID4+IG47Cglmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWNpbiA+PiBhW2ldOwoJfSAvL9Cy0LLQtdC70Lgg0YEg0LrQu9Cw0LLQuNCw0YLRg9GA0YsKCS8vcm9vdHNbMF0gPT0gbnVsbF9wdHIgKNC/0YPRgdGC0L7QtSDQtNC10YDQtdCy0L4pCglmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCXJvb3RzW2ldID0gcm9vdHNbaSAtIDFdOyAvL9C90L7QstGL0Lkg0LrQvtGA0LXQvdGMINGD0LrQsNC30YvQstCw0LXRgiDRgtGD0LTQsCDQttC1LCDRh9GC0L4g0Lgg0YHRgtCw0YDRi9C5CgkJdXBkYXRlKHJvb3RzW2ldLCAxLCBOLCBpLCBhW2ldKTsgLy/QvtCx0L3QvtCy0LvRj9C10Lwg0LTQtdGA0LXQstC+INGBINC90L7QstGL0Lwg0LrQvtGA0L3QtdC8LAoJCS8v0L/RgNC4INGN0YLQvtC8INGB0L7Qt9C00LDQtdGC0YHRjyDQtNC10LnRgdGC0LLQuNGC0LXQu9GM0L3QviDQvdC+0LLRi9C5INC60L7RgNC10L3RjCDQuCDQvdC10LrQvtGC0L7RgNGL0LUg0L3QvtCy0YvQtSDRg9C30LvRiwoJCS8v0LrQvtGA0LXQvdGMINC40LzQtdC10YIg0LTQuNCw0L/QsNC30L7QvSBbMSxOXSDQuCBpLdGC0L7QvNGDINGN0LvQtdC80LXQvdGC0YMg0L/RgNC40YHQstCw0LjQstCw0LXRgtGB0Y8g0LfQvdCw0YfQtdC90LjQtSBhW2ldCgl9CgkvLyBjb3V0IDw8IHJvb3RzWzJdIC0+IHZhbCA8PCBlbmRsOwoJZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKCQljb3V0IDw8IHJvb3RzW2ldIC0+IHZhbCA8PCAiICI7Cgl9Cgljb3V0IDw8IGVuZGw7CgkvLyBwcmludChyb290c1tuXSk7Cgljb3V0IDw8Z2V0c3VtKHJvb3RzWzJdLDEsTiwyLDMpIDw8ZW5kbDsgLy/QutCw0LrQsNGPINCx0YvQu9CwINGB0YPQvNC80LAg0L7RgiAyINC00L4gMyDQsiDQvNC+0LzQtdC90YIg0LLRgNC10LzQtdC90LggMgoJcm9vdHNbbisxXSA9IHJvb3RzW25dOyAvL9GB0LvQtdC00YPRjtGJ0LjQuSDQvNC+0LzQtdC90YIg0LLRgNC10LzQtdC90LggbisxCgl1cGRhdGUocm9vdHNbbisxXSwgMSwgTiwgMiwgMCk7IC8v0L7QsdC90YPQu9GP0LXQvCDQstGC0L7RgNC+0Lkg0Y3Qu9C10LzQtdC90YIKCWNvdXQgPDxnZXRzdW0ocm9vdHNbbl0sMSxOLDEsMykgPDxlbmRsOwoJY291dCA8PGdldHN1bShyb290c1tuKzFdLDEsTiwxLDMpIDw8ZW5kbDsKCXJldHVybiAwOwp9