Cod sursa(job #1119802)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 24 februarie 2014 20:09:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
using namespace std;

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

int N,M,maxarb[400010],start,stop,val,pos,maxim;

void actualizare(int nod, int st, int dr) {

    int div;
    if(st==dr) {
        maxarb[nod]=val;
        return ;
    }
    div=(st+dr)/2;
    if(pos<=div)
        actualizare(2*nod,st,div);
    else
        actualizare(2*nod+1,div+1,dr);

    if(maxarb[2*nod]>maxarb[2*nod+1])
        maxarb[nod]=maxarb[2*nod];
    else
        maxarb[nod]=maxarb[2*nod+1];

}

void interogare(int nod, int st, int dr) {

    int div;
    if(start<=st && dr<=stop) {
            if(maxim<maxarb[nod])
                maxim=maxarb[nod];
        return ;
    }
    div=(st+dr)/2;
    if(start<=div)
        interogare(2*nod,st,div);
    if(div<stop)
        interogare(2*nod+1,div+1,dr);

}

int main() {

    int y,x,i,tip;
    in>>N>>M;
    for(i=1;i<=N;i++) {
        in>>val;
        pos=i;
        actualizare(1,1,N);
    }

    for(i=1;i<=M;i++) {
        in>>tip>>x>>y;
        if(tip==1) {
            val=y;
            pos=x;
            actualizare(1,1,N);
        }
        if(tip==0) {
            maxim=-1;
            start=x;
            stop=y;
            interogare(1,1,N);
            out<<maxim<<'\n';
        }
    }


    in.close();
    out.close();
    return 0;

}