Cod sursa(job #1995488)

Utilizator DawlauAndrei Blahovici Dawlau Data 28 iunie 2017 01:53:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
#include<cmath>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int maxim(int a,int b){
    if(a>b)
        return a;
    return b;
}
const int NMAX=100005,k=log2(2*NMAX)+1;
int arb[1<<k],a,b,n,m,cmax;
void querry(int nod,int st,int dr){
    if(a<=st&&dr<=b){
        if(arb[nod]>cmax)
            cmax=arb[nod];
    }
    else{
        int mij=(st+dr)/2;
        if(a<=mij)
            querry(2*nod,st,mij);
        if(mij<b)
            querry(2*nod+1,mij+1,dr);
    }
}
void add(int nod,int st,int dr){
    if(st==dr)
        arb[nod]=b;
    else{
        int mij=(st+dr)/2;
        if(a<=mij)
            add(2*nod,st,mij);
        else
            add(2*nod+1,mij+1,dr);
        arb[nod]=maxim(arb[2*nod],arb[2*nod+1]);
    }
}
void citire(){
    int i,nr;
    fin>>n>>m;
    for(i=1;i<=n;++i){
        fin>>nr;
        a=i; b=nr;
        add(1,1,n);
    }
}
void solve(){
    while(m--){
        int cod;
        fin>>cod>>a>>b;
        if(cod==0){
            cmax=0;
            querry(1,1,n);
            fout<<cmax<<'\n';
        }
        else
            add(1,1,n);
    }
}
int main(){
    citire();
    solve();
}