Cod sursa(job #2532831)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 28 ianuarie 2020 14:00:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

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

int v[400005];
int n,val,poz,maxim,poz1,poz2;

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

void query(int nod,int st,int dr){
    if(dr < poz1 || st > poz2){
        return;
    }
    if(dr <= poz2 && st >= poz1){
        maxim = max(maxim,v[nod]);
        return;
    }
    int mid = (st+dr)/2;
    if(poz1 <= mid) query(2*nod,st,mid);
    if(mid < poz2) query(2*nod+1,mid+1,dr);
}

int main() {
    int t,i,p,aux,a,b;
    fin>>n>>t;
    for(i = 1; i <= n; i++){
        fin>>aux;
        val = aux;
        poz = i;
        update(1,1,n);
    }
    for(i = 1; i <= t; i++){
        fin>>p>>a>>b;
        if(p == 0){
            maxim = -1;
            poz1 = a;
            poz2 = b;
            query(1,1,n);
            fout<<maxim<<'\n';
        }else if(p == 1){
            poz = a;
            val = b;
            update(1,1,n);
        }
    }
    return 0;
}