Cod sursa(job #1673795)

Utilizator SirStevensIonut Morosan SirStevens Data 4 aprilie 2016 09:43:07
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

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

#define Nmax 100000
#define inf -1223443545
int n,m,a,b,c,Max[4*Nmax],left,right,finish,Pos,Val,start,res,x;

void Update(int nod, int left, int right){

    if(left == right){
        Max[nod]=Val;
        return;
    }
    if(left>right)
        return;
    int mij = (left + right)/2;
    if(Pos<=mij)Update(2*nod,left,mij);
    else Update(2*nod+1,mij+1,right);

    Max[nod]=max(Max[2*nod],Max[2*nod+1]);

}

void Querry(int nod, int left, int right){

    if(start<=left && right <= finish)
        res=max(res, Max[nod]);
    if(left >= right)
        return;
    int mij=(left+right)/2;
    if(start <= mij) Querry(2*nod,left,mij);
    if(finish>mij)  Querry(2*nod+1,mij+1,right);
}

int main(){

    in>>n>>m;
    for(int i=1;i<=n;i++){
        in>>x;
        Pos=i;Val=x;
        Update(1,1,n);
    }
    for(int i=1;i<=m;i++){
        in>>c>>a>>b;
        if(c==0){

            res=inf;
            start=a;finish=b;
            Querry(1,1,n);
            out<<res<<'\n';

        }
        else
        {
            Pos=a;Val=b;
            Update(1,1,n);
        }

    }
    return 0;

}