Cod sursa(job #2559957)

Utilizator Bulboaca_EugenBulboaca Alexandru Eugen Bulboaca_Eugen Data 27 februarie 2020 18:34:45
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int  MAXN = 1e5 + 3;
int aint[4 * MAXN], v[MAXN], n, m, maxim;
void update(int p, int left, int right, int st, int dr){
    if(right - left <= 0){
        aint[p] = dr;
        return;
    }
    int m = (left + right) / 2;
    if(st <= m) update(2 * p, left, m, st, dr);
    else update(2 * p + 1, m + 1, right, st, dr);
    aint[p] = max(aint[2 * p], aint[2 * p + 1]);
}
void query(int p, int left, int right, int st, int dr){
    if(st <= left and right <= dr){
        maxim = max(maxim , aint[p]);
        return;
    }
    int m = (left + right) / 2;
    if(m < dr) query(2 * p + 1, m + 1, right, st, dr);
    if(m >= st) query(2 * p, left, m, st, dr);
}
int main(){
    fin >> n >> m;
    for(int i = 1; i <= n; ++i){
        fin >> v[i];
        update(1, 1, n, i, v[i]);
    }
    for(int i = 1; i <= m; ++i){
        int type, x, y;
        fin >> type >> x >> y;
        if(type){
            update(1, 1, n, x, y);
        }
        else{
            query(1, 1, n, x, y);
            fout << maxim << '\n';
            maxim = 0;
        }
    }
    return 0;
}