Cod sursa(job #2751838)

Utilizator oporanu.alexAlex Oporanu oporanu.alex Data 15 mai 2021 21:58:25
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

int arbint[405], A[105];

int build(int start, int eend, int nod){
    if (start == eend)
        {
        arbint[nod] = A[start];
        return A[start];
        }

    int mid = (start + eend)/2;
    arbint[nod] = build(start, mid, nod * 2 + 1) + build(mid + 1, eend, nod * 2 + 2);
    return arbint[nod];

}
void update(int i, int stanga, int dreapta, int nod, int nou)
{
    if (i < stanga || i > dreapta)
        return;

    arbint[nod] += nou - A[i];

    if(stanga != dreapta)   /// adica am fii
        update(i, stanga, (stanga + dreapta)/2, nod * 2 + 1, nou);
        update(i, (stanga + dreapta) / 2 + 1, dreapta, nod * 2 + 2, nou);
}

int suma(int i, int j, int nod, int seg_stanga, int seg_dreapta){
    if (i <= seg_stanga && j >= seg_dreapta)
        {
            return arbint[nod];
        }

    if (seg_dreapta < i || seg_stanga > j)
		{
		    return 0;
		}
    int mid = (seg_stanga + seg_dreapta) / 2;
    return suma(i, j, 2 * nod + 1, seg_stanga, mid) +
     suma(i, j, 2 * nod + 2, mid + 1, seg_dreapta);

}

int main()
{


    int N, M;

    f >> N >> M;

    for (int i = 0; i < N; ++i)
        f >> A[i];
    int optiune, t, v, p, q;

    build(0, N - 1, 0);

    for (int i = 0; i < M; ++i)
    {
        f >> optiune;
        if (!optiune)
            {
            f >> t >> v;
            update(t - 1, 0, N - 1, 0, A[t - 1] - v);
            cout << "update pe pozitia " << t - 1 << "cu valoarea " << A[t - 1] - v << "\n";
            }
        else
            {
                f >> p >> q;
                g << suma(p - 1, q - 1, 0, 0, N - 1) << "\n";
            }
    }


    return 0;
}