Rezolvare completă PbInfo #1268 EasyQuery

Cerința

Urmează o perioadă aglomerată și trebuie să ajutați un magazin să își gestioneze stocul. Magazinul are N obiecte indexate de la 1 la N, iar fiecare obiect are un stoc. Trebuie să procesați T operații de tipul:

1) x y p: stocul obiectelor cu ale caror indice se afla intre [x, y] creste cu p
2) x y p: stocul obiectelor cu ale caror indice se afla intre [x, y] scade cu p

In urma unei operatii de tip 2 se poate ca stocul sa fie negativ, caz in care proprietarii raman cu datorie

Date de intrare

Programul citește din fisierul easyquery.in numărul n, pe urmatoarea linie n numere naturale reprezentand stocul magazinului, T, si apoi T intrebari definite ca mai sus.

Date de ieșire

Programul va afisa in fisierul easyquery.out stocul pentru fiecare obiect dupa cele T operatii.

Restricții și precizări

  • \(1 ≤ N ≤ 10^5\)
  • \(1 ≤ T ≤ 10^5\)
  • \(0 ≤ v_i ≤ 10^9\)
  • \(0 ≤ p ≤ 10^9\)

Exemplu

easyquery.in

5
1 2 6 3 1
3
1 5 5 2
2 4 5 1
1 1 5 3

easyquery.out

4 5 9 5 5

Explicație

In urma primei operatii stocul va fi (1 2 6 3 3)
In urma celei de a doua operatie stocul va fi (1 2 6 2 2)
In urma celei de a treia operatie stocul va fi (4 5 9 5 5)

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 EasyQuery:

#include <bits/stdc++.h>

const int MAX_N = 100000;

using namespace std;

int v[MAX_N];
long long s[MAX_N + 1];

int main(void)
{
    ifstream in("easyquery.in");
    ofstream out("easyquery.out");
    int n, T;
    int type, x, y, p;

    in >> n;
    for ( int i = 0; i < n; i++ )
        in >> v[i];
    in >> T;
    while (T--)
    {
        in >> type >> x >> y >> p;

        x--;
        y--;

        if (type == 2)
            p = -p;

        s[x] += p;
        s[y + 1] -= p;

    }
    in.close();

    long long sum = 0LL;
    for (int i = 0; i < n; i++)
    {
        sum += s[i];
        out << v[i] + sum << ' ';
    }
    out.close();
    return 0;
}

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 #1268 EasyQuery

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1268 EasyQuery 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!