Cod sursa(job #2508255)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 11 decembrie 2019 20:26:27
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX=100003;
int arbint[4*NMAX],v[NMAX];
int n,m,val,poz,maxim,start,finish;
int construct(int nod,int left,int right){
    if(left==right){
        arbint[nod]=v[left];
        return v[left];
    }
    int mid=left+(right-left)/2;
    arbint[nod]=max(construct(2*nod,left,mid),construct(2*nod+1,mid+1,right));
}
void update(int nod,int left,int right){
    if(left==right){
        arbint[nod]=val;
        return ;
        }
    int mij=left+(right-left)/2;
    if(poz<=mij) update(nod*2,left,mij);
    else update(nod*2+1,mij+1,right);
    arbint[nod]=max(arbint[2*nod],arbint[2*nod+1]);
}
void query(int nod,int left,int right){
    if(start<=left && right<=finish){
       maxim=max(maxim,arbint[nod]);
       return;}
    int mij=left+(right-left)/2;
    if(start<=mij) query(2*nod,left,mij);
    if(mij<finish) query(2*nod+1,mij+1,right);

}

int main()
{
    int tip,a,b;
    in>>n>>m;
    for(int i=1;i<=n;i++){
        in>>v[i];
    }
    construct(1,1,n);
    for(int i=1;i<=m;i++){
        in>>tip>>a>>b;
        if(tip){
            poz=a,val=b;
            update(1,1,n);
            continue;
        }
         start=a,finish=b,maxim=-1;
         query(1,1,n);
        out<<maxim<<'\n';
    }
    return 0;
}