using System;
using System.Collections.Generic;
using System.Diagnostics;
public class StackClass
{
private List<int> data = new List<int>(100000001);
private List<int> add = new List<int>(100000001);
private int inc = 0;
public void Push(int x)
{
data.Add(x);
if (add.Count > 0) add[add.Count-1] += inc;
add.Add(0);
inc = 0;
}
public int Pop()
{
int i = data.Count - 1;
int res = data[i] + (inc += add[i]);
add.RemoveAt(i);
data.RemoveAt(i);
return res;
}
public void Inc(int r, int delta)
{
if (r < add.Count)
add[r] += delta;
else
inc += delta;
}
}
public class Test
{
public static void Main()
{
var watch = new Stopwatch();
var stack = new StackClass();
var count = 100000001;
watch.Start();
for (int i = 0; i < count; i++)
{
stack.Push(i);
}
Console.WriteLine(watch.Elapsed);
watch.Restart();
for (int i = 0; i < count; i++)
{
stack.Inc(i, 2);
}
Console.WriteLine(watch.Elapsed);
watch.Restart();
for (int i = 0; i < count; i++)
{
stack.Pop();
}
Console.WriteLine(watch.Elapsed);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwoKcHVibGljIGNsYXNzIFN0YWNrQ2xhc3MKewogICAgcHJpdmF0ZSBMaXN0PGludD4gZGF0YSA9IG5ldyBMaXN0PGludD4oMTAwMDAwMDAxKTsKICAgIHByaXZhdGUgTGlzdDxpbnQ+IGFkZCA9IG5ldyBMaXN0PGludD4oMTAwMDAwMDAxKTsKICAgIHByaXZhdGUgaW50IGluYyA9IDA7CgogICAgcHVibGljIHZvaWQgUHVzaChpbnQgeCkKICAgIHsKICAgICAgICBkYXRhLkFkZCh4KTsKICAgICAgICBpZiAoYWRkLkNvdW50ID4gMCkgYWRkW2FkZC5Db3VudC0xXSArPSBpbmM7CiAgICAgICAgYWRkLkFkZCgwKTsKICAgICAgICBpbmMgPSAwOwogICAgfQoKICAgIHB1YmxpYyBpbnQgUG9wKCkKICAgIHsKICAgICAgICBpbnQgaSA9IGRhdGEuQ291bnQgLSAxOwogICAgICAgIGludCByZXMgPSBkYXRhW2ldICsgKGluYyArPSBhZGRbaV0pOwoKICAgICAgICBhZGQuUmVtb3ZlQXQoaSk7CiAgICAgICAgZGF0YS5SZW1vdmVBdChpKTsKCiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBJbmMoaW50IHIsIGludCBkZWx0YSkKICAgIHsKICAgICAgICBpZiAociA8IGFkZC5Db3VudCkKICAgICAgICAgICAgYWRkW3JdICs9IGRlbHRhOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaW5jICs9IGRlbHRhOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJIHZhciB3YXRjaCA9IG5ldyBTdG9wd2F0Y2goKTsKCQkgdmFyIHN0YWNrID0gbmV3IFN0YWNrQ2xhc3MoKTsKCQkKCQkgdmFyIGNvdW50ID0gMTAwMDAwMDAxOwoJCQoJCSB3YXRjaC5TdGFydCgpOwoJCSBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCgkJIHsKCQkgICAgIHN0YWNrLlB1c2goaSk7CgkJIH0KCQkgQ29uc29sZS5Xcml0ZUxpbmUod2F0Y2guRWxhcHNlZCk7CgkJIHdhdGNoLlJlc3RhcnQoKTsKCQkKCQkgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQoJCSB7CgkJICAgICBzdGFjay5JbmMoaSwgMik7CgkJIH0KCQkgQ29uc29sZS5Xcml0ZUxpbmUod2F0Y2guRWxhcHNlZCk7CgkJIHdhdGNoLlJlc3RhcnQoKTsKCQkKCQkgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQoJCSB7CgkJICAgICBzdGFjay5Qb3AoKTsKCQkgfQoJCSBDb25zb2xlLldyaXRlTGluZSh3YXRjaC5FbGFwc2VkKTsKCX0KfQ==