Cod sursa(job #2905123)

Utilizator matwudemagogul matwu Data 19 mai 2022 18:04:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, t[400001], v[400001], q, c;
void build(int a[], int v, int tl, int tr){

    if(tl == tr)
        t[v] = a[tl];
    else{
        int tm = (tl + tr) / 2;
        build(a, 2 * v, tl, tm);
        build(a, 2 * v + 1, tm + 1, tr);
        t[v] = max(t[v * 2], t[v * 2 + 1]);
    }
}

int maxim(int v, int tl, int tr, int l, int r){

    if(l > r) return 0;
    if(l == tl && r == tr) return t[v];

    int tm = (tl + tr) / 2;
    int max1 = maxim(v * 2, tl, tm, l, min(r, tm));
    int max2 = maxim(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);

    return max(max1, max2);
}

void update(int v, int tl, int tr, int pos, int nevl){

    if(tl == tr) t[v] = nevl;
    else{
        int tm = (tl + tr) / 2;
        if(pos <= tm)
            update(v * 2, tl, tm, pos, nevl);
        else update(v * 2 + 1, tm + 1, tr, pos, nevl);
        t[v] = max(t[v * 2], t[v * 2 + 1]);
    }
}

int main(){

    ios_base::sync_with_stdio(false);
    fin.tie(NULL);

    fin >> n >> q;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    
    build(v, 1, 1, n);
    while(q){
        q--;
        fin >> c;
        if(c){

            int a, b;
            fin >> a >> b;
            update(1, 1, n, a, b);
        }
        else{
            int l ,r;
            fin >> l >> r;
            fout << maxim(1, 1, n, l, r) << '\n';
        }
    }
}