# PBinfo #1835 – twoop – Rezolvare C++

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

## Enunț

Se dă un șir de N elemente, numere întregi. Pe acest șir se aplică operații de două tipuri :

Tip 1: st dr val – elementele de pe pozițiile din intervalul [st, dr] cresc cu valoarea val
Tip 2: poz – să se afișeze valoarea elementului de pe poziția poz .
Toate operațiile de tipul 2 se aplică numai după ce s-au aplicat toate operațiile de tipul 1.

Cerința
Dându-se șirul de elemente și operațiile, începand cu cele de tipul 1, aplicați operațiile pe șir.

Date de intrare
Fișierul de intrare twoop.in conține pe prima linie numărul de elemente, N , numărul de operații de tip 1, nrOp1 , și numărul de operații de tip 2, nrOp2.
Pe următoarea linie se află cele N elemente separate printr-un spațiu.
Pe următoarele nrOp1 linii se află câte o operație de tip 1 sub forma: st dr val.
Pe următoarele nrOp2 linii se află câte o operație de tip 2 sub forma: poz.

Date de ieșire
Fișierul de ieșire twoop.out va conține pe primele nrOp2 linii câte un element, rezultatul unei operații de tip 2.

Restricții și precizări
1 ≤ N ≤ 100.000
-1.000.000.000 ≤ a[i], val ≤ 1.000.000.000
1 ≤ st ≤ dr ≤ N
1 ≤ poz ≤ N

Exemplu:
twoop.in

4 4 2
5 0 -1 2
1 2 -2
2 3 10
1 4 2
2 3 3
2
3
twoop.out

13
14
Explicație
5 0 -1 2 – șir initial
3 -2 -1 2 – după operația 1
3 8 9 2 – după operația 2
5 10 11 4 – după operația 3
5 13 14 4 – după operația 4

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
ifstream f("twoop.in");
ofstream g("twoop.out");
#define NMAX 100010
int n, nrOp1, nrOp2, st, dr, val, poz;
long long v[NMAX], res[NMAX];
void op1()
{
    res[st] += val;
    res[dr + 1] -= val;
}
void precalc()
{
    int i;
    for (i = 1;i <= n;i++)
        res[i] += res[i - 1];
}
void op2()
{
    g<<res[poz] + v[poz]<<'\n';
}
int main()
{
    int i;
    f>>n>>nrOp1>>nrOp2;
    for (i = 1;i <= n;i++)
        f>>v[i];
    for (i = 1;i <= nrOp1;i++)
    {
        f>>st>>dr>>val;
        op1();
    }
    precalc();
    for (i = 1;i <= nrOp2;i++)
    {
        f>>poz;
        op2();
    }
}
```

## Resurse

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