Cod sursa(job #2618282)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 24 mai 2020 16:21:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
#define dim 100005

using namespace std;

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

int tree[4 * dim]; // arborele
int n, x; // numarul de valori - citire
int Q; // numar de query-uri
int T, A, B; // tipul de interogare, capetele interogarii
int start, finish; // Query
int maxx; // Query - det max
int pos, val; // Update

void Update (int nod, int left, int right) {
    if (left == right) {
        tree[nod] = val; // completam frunza
        return;
    }
    int mid = (left + right) / 2;
    if (pos <= mid) Update (2 * nod, left, mid);
    else Update (2 * nod + 1, mid + 1, right);
    tree[nod] = max (tree[2 * nod], tree[2 * nod + 1]); // actualizam restul elementelor in maniera bottom-up
}

void Query (int nod, int left, int right) {
    if (start <= left && right <= finish) {
        if (maxx < tree[nod]) maxx = tree[nod]; // intervalul curent se afla in interiorul intervalului interogat
        return;
    }
    int mid = (left + right) / 2;
    if (start <= mid) Query (2 * nod, left, mid);
    if (mid < finish) Query (2 * nod + 1, mid + 1, right);
}

int main() {
    fin >> n >> Q;
    for (int i = 1; i <= n; i ++) {
        fin >> x;
        pos = i, val = x;
        Update (1, 1, n);
    }
    while (Q --) {
        fin >> T >> A >> B;
        if (T == 0) {
            maxx = -1;
            start = A, finish = B;
            Query (1, 1, n);
            fout << maxx << '\n';
        } else {
            pos = A, val = B;
            Update (1, 1, n);
        }
    }
    fin.close ();
    fout.close ();
    return 0;
}