Cod sursa(job #2737877)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 5 aprilie 2021 11:36:42
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX(100005);

struct AINT{
    int vec[4 * NMAX + 5];
    AINT(){
        memset(vec, 0, sizeof(vec));
    }
    void Update(int nod, int st, int dr, int val, int poz){
        if(st == dr){
            vec[nod] = val;
            return;
        }
        int mij = (st + dr) / 2;
        if(poz <= mij)
            Update(2 * nod, st, mij, val, poz);
        else Update(2 * nod + 1, mij + 1, dr, val, poz);

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

    int Query(int nod, int st, int dr, int a, int b){
        if(a <= st && dr <= b)
            return vec[nod];
        int mij = (st + dr) / 2, val1 = 0, val2 = 0;
        if(a <= mij)
            val1 = Query(2 * nod, st, mij, a, b);
        if(b > mij)
            val2 = Query(2 * nod + 1, mij + 1, dr, a, b);
        return max(val1, val2);
    }
};

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

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

        Arb.Update(1, 1, n, x, i);
    }

    for(int i = 1; i <= m; ++i){
        int tip, a, b;
        fin >> tip >> a >> b;

        if(tip == 0)
            fout << Arb.Query(1, 1, n, a, b) << '\n';
        else Arb.Update(1, 1, n, b, a);
    }
    return 0;
}