Cod sursa(job #3206620)

Utilizator juniorOvidiu Rosca junior Data 23 februarie 2024 17:23:16
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <vector>

using namespace std;

#define dim 100001

int N, M;
vector<int> a(3 * dim);

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

    if (l == r) {
        a[nod] = Val;
        return;
    }

    m = (l + r) / 2;
    if (Pos <= m)
        Update(2 * nod, l, m, Pos, Val);
    else
        Update(2 * nod + 1, m + 1, r, Pos, Val);

    a[nod] = max(a[2 * nod], a[2 * nod + 1]);
}

int Query(int nod, int l, int r, int start, int finish) {
    int m;

    if (start <= l && r <= finish) // Maximul intre [start, finish] este în a[nod].
        return a[nod];

    m = (l + r) / 2;
    int maxim = -1;
    if (start <= m)
        maxim = max(maxim, Query(2 * nod, l, m, start, finish));
    if (m < finish)
        maxim = max(maxim, Query(2 * nod + 1, m + 1, r, start, finish));

    return maxim;
}

int main() {
    ifstream fin("datorii.in");
    ofstream fout("datorii.out");

    fin >> N >> M;
    for (int i = 1; i <= N; i++) {
        int X;
        fin >> X;
        Update(1, 1, N, i, X);
    }

    for (int i = 1; i <= M; i++) {
        int X, A, B;
        fin >> X >> A >> B;
        if (X == 0) {
            fout << Query(1, 1, N, A, B) << '\n';
        } else {
            Update(1, 1, N, A, B);
        }
    }

    fin.close();
    fout.close();

    return 0;
}