Cod sursa(job #2626571)

Utilizator andreea.sbobAndreea Surdu-Bob andreea.sbob Data 6 iunie 2020 22:28:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>

using namespace std;
int intArb[100000], v[400004];

int interogare(int nod, int st, int dr, int a, int b) {
    if (a > dr || b < st || st > dr)
        return -1;
    if (st >= a && dr <= b)
        return v[nod];
    int k = interogare(2*nod, st, (st+dr)/2, a, b);
    int j = interogare(2*nod+1, (st+dr)/2+1, dr, a, b);
    if (k == -1)
        return j;
    if (j == -1)
        return k;
    if (intArb[j] > intArb[k])
        return j;
    return k;
}

void actualizare(int nod, int st, int dr, int ind) {
    if (ind < st || ind > dr)
        return;
    if (st == dr) {
        v[nod] = st;
    } else {
        actualizare(2*nod, st, (st+dr)/2, ind);
        actualizare(2*nod+1, (st+dr)/2+1, dr, ind);
        if(intArb[v[2*nod]] > intArb[v[2*nod+1]]) {
            v[nod] = v[2*nod];
        } else {
            v[nod] = v[2*nod+1];
        }
    }
}

void init(int nod, int st, int dr) {
    if (st < 0)
        return;
    if (st == dr) {
        v[nod] = st;
    } else {
        init(2*nod, st, (st+dr)/2);
        init(2*nod+1, (st+dr)/2+1, dr);
        if (intArb[v[2*nod]] > intArb[v[2*nod+1]]) {
            v[nod] = v[2*nod];
        } else {
            v[nod] = v[2*nod+1];
        }
    }
}

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

    int n, m, op, a, b;
    fin >> n >> m;
    for (int i = 0; i < n; i++) {
        fin >> intArb[i];
    }
    init(1, 0, n-1);
    for (int i = 0; i < m; i++) {
        fin >> op >> a >> b;
        if (op == 0) {
            fout << intArb[interogare(1, 0, n-1, a-1, b-1)] << '\n';
        } else {
            intArb[a-1] = b;
            actualizare(1, 0, n-1, a-1);
        }
    }
    return 0;
}