Rezolvare completă PbInfo #1835 twoop

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 ≤ 100000
-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

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema twoop:

#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();
    }
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1835 twoop

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1835 twoop de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!