# PBinfo #3695 – iziStack – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Se dă o stivă vidă. Elementele stivei sunt numerotate incepand cu 1 de la bază înspre vârf. Avem de procesat T comenzi de tipurile:


0 x – elementul x se va adăuga în vârful stivei
1 x y add – tuturor elementelor din intervalul x y le va fi adăugată valoarea add
2 – eliminarea elementului din vârf

Cerința
Afisați dupa fiecare operație elementul din vârful stivei.
Se garantează:
1. că nu se va efectua operația de tip 2 dacă nu există cel puțin două elemente în stivă;
2. că prima operatie va fi de tipul 0

Date de intrare
Fișierul de intrare izi.in conține pe prima linie un număr natural T, iar pe următoarele T linii operațiile efectuate asupra stivei.

Date de ieșire
Fișierul de ieșire izi.out va conține T linii, reprezentând elementele din vârful stivei dupa fiecare operație.

Restricții și precizări

1 ≤ T ≤ 1.000.000
• -1000 ≤ add ≤ 1000
• Pentru operațiile de tip 1, -1000 ≤ x ≤ 1000, iar pentru operatiile de tip 2 numărul elementelor aflate în stivă este mai mare ca y
• Pentru 36 puncte: 1 ≤ T ≤ 1000
• Pentru alte 33 puncte: Toate operatiile de tip 2 se vor afla la finalul fișierului de intrare

Exemplu:
izi.in

7
0 1
1 1 1 2
0 2
1 1 2 3
2
0 4
2
izi.out

1
3
2
5
6
4
6

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
class InParser
{
private:
    FILE *fin;
    char *buff;
    int sp;
    char read_ch()
    {
        ++sp;
        if (sp == 4096)
        {
            sp = 0;
            fread(buff, 1, 4096, fin);
        }
        return buff[sp];
    }
public:
    InParser(const char *nume)
    {
        fin = fopen(nume, "r");
        buff = new char[4096]();
        sp = 4095;
    }
    InParser &operator>>(int &n)
    {
        char c;
        while (!isdigit(c = read_ch()) && c != '-')
            ;
        int sgn = 1;
        if (c == '-')
        {
            n = 0;
            sgn = -1;
        }
        else
        {
            n = c - '0';
        }
        while (isdigit(c = read_ch()))
        {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }
};
const int NMAX = 1000005;
int N;
int aib[NMAX];
inline int lsb(int x)
{
    return x & (-x);
}
void update(int pos, int val)
{
    for (; pos <= N; pos += lsb(pos))
        aib[pos] += val;
}
int query(int pos)
{
    int r = 0;
    for (; pos; pos -= lsb(pos))
        r += aib[pos];
    return r;
}
int main()
{
    InParser cin("izi.in");
    ofstream cout("izi.out");
    int T;
    cin >> T;
    N = T + 2;
    int curr = N - 1;
    while (T--)
    {
        int op;
        cin >> op;
        if (op == 0)
        {
            int x;
            cin >> x;
            update(curr, x);
            update(curr + 1, -x);
            curr--;
            cout << x << '\n';
        }
        else if (op == 1)
        {
            int a, b, plus;
            cin >> a >> b >> plus;
            update(N - b, plus);
            update(N - a + 1, -plus);
            cout << query(curr + 1) << '\n';
        }
        else
        {
            int val = query(curr + 1);
            update(curr + 1, -val);
            update(curr + 2, val);
            curr += 1;
            cout << query(curr + 1) << '\n';
        }
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3695)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3695/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3695/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
