Cod sursa(job #2671900)

Utilizator jojelPintilie Georgian jojel Data 12 noiembrie 2020 19:50:59
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

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

int tree[400100];
int n, m;
int maxim;

void update(int nod, int st, int dr, int poz, int val){
    if(st == dr){
        tree[nod] = val;
        return;
    }

    int m = (st + dr) / 2;

    if(poz <= m)
        update(2 * nod, st, m, poz ,val);
    else
        update(2 * nod + 1, m + 1, dr, poz, val);

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

void query(int nod, int st, int dr, int start, int sfarsit){
    if(start <= st && dr <= sfarsit){
        if(maxim < tree[nod])
            maxim = tree[nod];
        return;
    }

    int m = (st + dr) / 2;
    if(start <= m)
        query(2 * nod, st, m, start, sfarsit);
    if(m < sfarsit)
        query(2 * nod + 1, m + 1, dr, start, sfarsit);
}

int main(){
    fin >> n >> m;

    int x;

    for(int i = 1; i <= n; i++){
        fin >> x;

        update(1,1,n,i,x);
    }

    int op;
    int a, b;

    while(m--){
        fin >> op >> a >> b;

        if(op == 0){
            maxim = -1;

            query(1,1,n,a,b);

            fout << maxim << '\n';
        }
        else
            update(1,1,n,a,b);
    }

    fin.close();
    fout.close();

    return 0;
}