Cod sursa(job #2158940)

Utilizator raul044Moldovan Raul raul044 Data 10 martie 2018 17:20:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#define maxN 100001

using namespace std;

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

int n, m, maxim;
int ARB[4*maxN + 66];

void Update (int nod, int left, int right, int val, int poz) {
    if (left == right) {
        ARB[nod] = val;
        return;
    }
    else {
        int mid = (left + right)/2;
        if (poz <= mid)
            Update(2*nod, left, mid, val, poz);
        else
            Update(2*nod+1, mid+1, right, val, poz);
    }
    ARB[nod] = max(ARB[2*nod], ARB[2*nod+1]);
}

void Query (int nod, int left, int right, int a, int b) {
    if (a <= left and right <= b) {
        if (ARB[nod] > maxim)
            maxim = ARB[nod];
        //return;
    }
    else {
        int mid = (left+ right)/2;
        if (a <= mid)
            Query(2*nod, left, mid, a, b);
        if (mid < b)
            Query(2*nod+1, mid+1, right, a, b);
    }
}

int main () {
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        int val;
        fin >> val;

        Update(1, 1, n, val, i);
    }

    for (int i = 1; i <= m; ++i) {
        int Q;
        fin >> Q;
        if (Q == 0) {
            maxim = -1;
            int a, b;
            fin >> a >> b;

            Query(1, 1, n, a, b);
            fout << maxim << '\n';
        }
        else {
            int a, b;
            fin >> a >> b;
            Update(1, 1, n, b, a);
        }
    }

    return 0;
}