Cod sursa(job #2470110)

Utilizator WilIiamperWilliam Damian Balint WilIiamper Data 8 octombrie 2019 18:30:55
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#define NMax 1000000

using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n, m, a[NMax], b[NMax], tip, x, y, maxim;
const int MIN = -1;
void actualizare(int st, int dr, int nod) {
    if (st == dr) {
        b[nod] = y;
        return;
    }
    int mid = st + (dr-st)/2;
    if (mid <= x)
        actualizare(mid+1, dr, nod*2+1);
    else
        actualizare(st, mid, nod*2);

    b[nod] = max(b[nod * 2], b[nod * 2 + 1]);
}
int interogare (int st, int dr, int nod) {
    if (dr < x || st > y)
        return MIN;
    else if (st >= x && dr <= y)
        return b[nod];
    else {
        int mid = st + (dr-st)/2;
        maxim = max(interogare(st, mid, nod*2), interogare(mid+1, dr, 2*nod+1));
        return maxim;
    }
}
int arbore(int st, int dr, int nod) {
    if (st == dr) {
        b[nod] = a[st];
        return b[nod];
    }
    else {
        int mid = st + (dr-st)/2;
        b[nod] = max(arbore(st, mid, 2*nod), arbore(mid+1, dr, 2*nod+1));
        return b[nod];
    }
}
int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> a[i];
    arbore(1, n, 1);
    for (int i = 1; i <= m; i++) {
        fin >> tip >> x >> y;
        if (tip == 0) {
            interogare(1, n, 1);
            fout << maxim << "\n";
        }
        else
            actualizare (1, n, 1);
    }
    return 0;
}