Cod sursa(job #3339172)

Utilizator IuriIamandi Iuri Iuri Data 6 februarie 2026 17:25:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int dim = 1e5;
int t[4 * dim + 2], M;
void build(int nod, int st, int dr){
    if(st == dr){
        in >> t[nod];
        return;
    }
    int mij = (st + dr) >> 1;
    build(nod << 1, st, mij);
    build((nod << 1) + 1, mij + 1, dr);
    t[nod] = max(t[nod << 1], t[(nod << 1) + 1]);
}
void update(int pos, int val, int nod, int st, int dr){
    if(st == dr){
        t[nod] = val;
        return;
    }
    int mij = (st + dr) >> 1;
    if(pos <= mij)
        update(pos, val, nod << 1, st, mij);
    else
        update(pos, val, (nod << 1) + 1, mij + 1, dr);
    t[nod] = max(t[nod << 1], t[(nod << 1) + 1]);
}
void query(int nod, int st, int dr, int start, int finish){
    if(start <= st && dr <= finish){
        M = max(M, t[nod]);
        return;
    }
    int mij = (st + dr) >> 1;
    if(start <= mij)
        query(nod << 1, st, mij, start, finish);
    if(mij < finish)
        query((nod << 1) + 1, mij + 1, dr, start, finish);
}
main(){
    int n, m, i, j, tip, a, b;
    in >> n >> m;
    build(1, 1, n);
    while(m--){
        in >> tip >> a >> b;
        if(tip == 0){
            M = -1;
            query(1, 1, n, a, b);
            out << M << '\n';
        }
        else
            update(a, b, 1, 1, n);
    }
    return 0;
}