Cod sursa(job #2706019)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 13 februarie 2021 17:26:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;

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

int v[400005];

int query(int nod,int qst,int qdr, int st, int dr){
    if(qst<=st && dr<=qdr){ //este intervalul selectat inclus în intervalul de query?
        return v[nod];
    }else if(qst>dr || qdr<st){ //daca intervalul selectat nu se intersecteaza cu intervalul de query:
        return -1;
    }else{
        int mid = (st+dr)/2; //dacă se intersecteaza, dar nu e inclus
        return max(query(2*nod,qst,qdr,st,mid),query(2*nod+1,qst,qdr,mid+1,dr));
    }
}

void update(int val,int nod, int poz, int st,int dr){
    if(st == dr){
        v[nod] = val;
        return;
    }
    int mid = (st+dr)/2;
    if(poz<= mid){
        update(val,2*nod,poz,st,mid);
    }else{
        update(val,2*nod+1,poz,mid+1,dr);
    }
    v[nod] = max(v[2*nod],v[2*nod+1]);
}

int main() {
    int n,m,i,p,a,b;
    fin>>n>>m;
    for(i = 1; i <= n; i++){
        fin>>a;
        update(a,1,i,1,n);
    }
    for(i = 1; i <= m; i++){
        fin>>p>>a>>b;
        if(p == 0){ //maxim
            fout<<query(1,a,b,1,n)<<'\n';
        }else{
            update(b,1,a,1,n);
        }
    }
    return 0;
}