Cod sursa(job #2565093)

Utilizator xCata02Catalin Brita xCata02 Data 2 martie 2020 12:07:36
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;

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

#define cin  fin
#define cout fout

#define Nmax 100010

int n, Max;
int intervale[4 * Nmax + 100];

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

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

    intervale[nod] = max( intervale[ 2*nod ], intervale[ 2*nod + 1]);
}

void query(int nod, int left, int right, int start, int finish) {
    if(start <= left && finish >= right) {
        Max = max(Max, intervale[nod]);
        return;
    }

    int mijl = (left + right) / 2;

    if(start <= mijl) {
        query(2*nod, left, mijl, start, finish);
    } else if( finish > mijl){
        query(2*nod+1, mijl+1, right, start, finish);
    }
}

int main() {
    int q;
    cin >> n >> q;
    for(int i=1; i<=n; i++) {
        int x;
        cin >> x;
        update(1, 1, n, i, x);
    }

    while(q--) {
        int caz, a, b;
        cin >> caz >> a >> b;
        if(caz == 1) {
            update(1, 1, n, a, b);
        } else {
            Max = -1;
            query(1, 1, n, a, b);
            cout << Max << endl;
        }
    }
}