Cod sursa(job #3206781)

Utilizator juniorOvidiu Rosca junior Data 24 februarie 2024 06:32:45
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
using namespace std;

#define dim 15001

int N, M, i, X, A, B;
int a[3 * dim];
int start, finish, Val, Pos, maxim;
ifstream fin("datorii.in");
ofstream fout("datorii.out");

void Update(int nod, int l, int r) {
    int m;

    if (l < r) {   
        m = (l + r) / 2;
        if (Pos <= m)
            Update(2 * nod, l, m);
        else
            Update(2 * nod + 1, m + 1, r);
        a[nod] = max(a[2 * nod], a[2 * nod + 1]);   
    }
    else
        a[nod] -= Val; // Se scade valoarea achitată din datoria corespunzătoare zilei.
}

void Query(int nod, int l, int r) {
    int m;

    if (start <= l && r <= finish) { // Maximul intre [l, r] este în a[nod].
        if (maxim < a[nod])
            maxim = a[nod];
        return;
    }
    m = (l + r) / 2;
    if (start <= m)
        Query(2 * nod, l, m);
    if (m < finish)
        Query(2 * nod + 1, m + 1, r);
}

int main() {
    fin >> N >> M;
    for (i = 1; i <= N; i++) {
        fin >> X;
        Pos = i, Val = X;
        Update(1, 1, N);
    }
    for (i = 1; i <= M; i++) {
        fin >> X >> A >> B;
        if (X == 1) {
            maxim = -1;
            start = A, finish = B;
            Query(1, 1, N);
            fout << maxim << '\n';
        }
        else {
            Pos = A, Val = B;
            Update(1, 1, N);
        }
    }
    return 0;
}