Cod sursa(job #3166410)

Utilizator not_anduAndu Scheusan not_andu Data 8 noiembrie 2023 18:29:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
/**
 * Author: Andu Scheusan (not_andu)
 * Created: 08.11.2023 18:05:13
*/

#include <bits/stdc++.h>
#pragma GCC optimize("O3")

using namespace std;

#define INFILE "arbint.in"
#define OUTFILE "arbint.out"

typedef long long ll;

const int VMAX = 1e5 + 5;

int n, queries, t;
int v[VMAX], aint[VMAX * 4];

void build(int st, int dr, int i){
    if(st == dr){
        aint[i] = v[st];
        return;
    }
    int mij = (st + dr) / 2;
    build(st, mij, 2 * i);
    build(mij + 1, dr, 2 * i + 1);
    aint[i] = max(aint[2 * i], aint[2 * i + 1]);
}

void update(int st, int dr, int i, int j, int v){
    if(st == dr){
        aint[i] = v;
        return;
    }
    int mij = (st + dr) / 2;
    if(j <= mij)
        update(st, mij, 2 * i, j, v);
    else
        update(mij + 1, dr, 2 * i + 1, j, v);
    aint[i] = max(aint[2 * i], aint[2 * i + 1]);
}

int query(int st, int dr, int i, int l, int r){
    if(l <= st && dr <= r){
        return aint[i];
    }
    int mij = (st + dr) / 2;
    if(r <= mij){
        return query(st, mij, 2 * i, l, r);
    }else if(l >= mij + 1){
        return query(mij + 1, dr, 2 * i + 1, l, r);
    }
    return max(query(st, mij, 2 * i, l, r),query(mij + 1, dr, 2 * i + 1, l, r));
}

void solve(){

    cin >> n >> queries;

    for(int i = 1; i <= n; ++i) cin >> v[i];

    build(1, n, 1);

    for(int i = 0; i < queries; ++i){
        
        int tip, a, b; cin >> tip >> a >> b;

        if(tip == 0){
            cout << query(1, n, 1, a, b) << '\n';
        }
        else{
            update(1, n, 1, a, b);
        }

    }

}

int main(){
    
    ios_base::sync_with_stdio(false);

    freopen(INFILE, "r", stdin);
    freopen(OUTFILE, "w", stdout);

    cin.tie(nullptr);
    cout.tie(nullptr);

    solve();

    return 0;
}