using System;
using System.Diagnostics;
public class StackClass
{
private int[] data = new int[100000001];
private int[] add = new int[100000001];
private int inc = 0;
private int i = -1;
public void Push(int x)
{
if (i >= 0) add[i] += inc;
inc = 0;
data[++i] = x;
}
public int Pop()
{
inc += add[i];
add[i] = 0;
return data[i--] + inc;
}
public void Inc(int r, int delta)
{
if (r <= i)
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);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CgpwdWJsaWMgY2xhc3MgU3RhY2tDbGFzcwp7Cglwcml2YXRlIGludFtdIGRhdGEgPSBuZXcgaW50WzEwMDAwMDAwMV07Cglwcml2YXRlIGludFtdIGFkZCA9IG5ldyBpbnRbMTAwMDAwMDAxXTsKCXByaXZhdGUgaW50IGluYyA9IDA7Cglwcml2YXRlIGludCBpID0gLTE7CgkKCXB1YmxpYyB2b2lkIFB1c2goaW50IHgpCgl7CiAgICAgICAgaWYgKGkgPj0gMCkgYWRkW2ldICs9IGluYzsKICAgICAgICBpbmMgPSAwOwoJCWRhdGFbKytpXSA9IHg7Cgl9CgkKCXB1YmxpYyBpbnQgUG9wKCkKCXsKCQlpbmMgKz0gYWRkW2ldOwoJCWFkZFtpXSA9IDA7CgkJcmV0dXJuIGRhdGFbaS0tXSArIGluYzsKCX0KCQoJcHVibGljIHZvaWQgSW5jKGludCByLCBpbnQgZGVsdGEpCgl7CgkJaWYgKHIgPD0gaSkKCQkJYWRkW3JdICs9IGRlbHRhOwoJCWVsc2UKCQkJaW5jICs9IGRlbHRhOwoJfQp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJIHZhciB3YXRjaCA9IG5ldyBTdG9wd2F0Y2goKTsKCQkgdmFyIHN0YWNrID0gbmV3IFN0YWNrQ2xhc3MoKTsKCQkKCQkgdmFyIGNvdW50ID0gMTAwMDAwMDAxOwoJCQoJCSB3YXRjaC5TdGFydCgpOwoJCSBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCgkJIHsKCQkgICAgIHN0YWNrLlB1c2goaSk7CgkJIH0KCQkgQ29uc29sZS5Xcml0ZUxpbmUod2F0Y2guRWxhcHNlZCk7CgkJIHdhdGNoLlJlc3RhcnQoKTsKCQkKCQkgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQoJCSB7CgkJICAgICBzdGFjay5JbmMoaSwgMik7CgkJIH0KCQkgQ29uc29sZS5Xcml0ZUxpbmUod2F0Y2guRWxhcHNlZCk7CgkJIHdhdGNoLlJlc3RhcnQoKTsKCQkKCQkgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQoJCSB7CgkJICAgICBzdGFjay5Qb3AoKTsKCQkgfQoJCSBDb25zb2xlLldyaXRlTGluZSh3YXRjaC5FbGFwc2VkKTsKCX0KfQ==