Cod sursa(job #3152541)

Utilizator buntaruButnaru Petre buntaru Data 25 septembrie 2023 17:48:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#define minim -1
using namespace std;

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

int n , m , a , b , q , tree[400005];

void update(int node , int st , int dr , int poz , int val){
    if(st == dr){
        tree[node] = val;
        return;
    }
    int m = (st + dr)/2;
    if(poz <= m){
        update(2*node , st , m , poz , val);
    }
    else if(poz > m){
        update(2*node+1 , m+1 , dr , poz , val);
    }
    tree[node]=max(tree[2*node] , tree[2*node + 1]);
}

int get(int node , int st , int dr , int a , int b){
    if((a <= st) && (dr <= b)){
        return tree[node];
    }
    int vmax = minim;
    int m = (st + dr)/2;
    if(a <= m){
        vmax = max(vmax , get(2*node , st , m , a , b));
    }
    if(m < b){
        vmax = max(vmax , get(2*node+1 , m+1 , dr , a , b));
    }
    return vmax;
}

int main()
{
    fin>>n>>m;
    for(int i=1 ; i<=4*n ; i++)
        tree[i]=minim;
    for(int i=1 ; i<=n ; i++){
        int x;
        fin>>x;
        update(1 , 1 , n , i , x);
    }
    for(int i=1 ; i<=m ; i++){
        fin>>q>>a>>b;
        if(q == 1){
            update(1 , 1 , n , a , b);
        }
        else{
            fout<<get(1 , 1 , n , a , b)<<'\n';
        }
    }
    return 0;
}