Cod sursa(job #1783743)

Utilizator AndreiFlorescuAndrei Florescu AndreiFlorescu Data 19 octombrie 2016 13:20:33
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>

using namespace std;

int aint[2 * 100001];
int pos, val, sol;
int start, finish;

int maxim (int a, int b) {
    if (a > b) {
        return a;
    }
    return b;
}

void update (int nod, int left, int right) {
    if (left == right) {
        aint[nod] = val;
        return;
    }

    int div = (left + right) / 2;
    if (pos <= div) {
        update (2 * nod, left, div);
    } else {
        update (2 * nod + 1, div + 1, right);
    }

    aint[nod] = maxim (aint[2 * nod], aint[2 * nod + 1]);
}

void query (int nod, int left, int right) {
    if (start <= left && right <= finish) {
        if (sol < aint[nod]) {
            sol = aint[nod];
        }
        return;
    }

    int div = (left + right) / 2;
    if (start <= div) {
        query (2 * nod, left, div);
    }
    if (div < finish) {
        query (2 * nod + 1, div + 1, right);
    }
}

int main() {
    ifstream file_in ("arbint.in");
    ofstream file_out ("arbint.out");

    int n, m;
    bool op;
    int x, y;
    int i;

    file_in >> n >> m;
    for (i = 1; i <= n; i++) {
        file_in >> val;
        pos = i;
        update (1, 1, n);
    }

    for (i = 0; i < m; i++) {
        file_in >> op >> x >> y;
        if (op) {
            pos = x;
            val = y;
            update (1, 1, n);
        } else {
            start = x;
            finish = y;
            sol = -1;
            query (1, 1, n);
            file_out << sol << "\n";
        }
    }

    return 0;
}