Cod sursa(job #357984)

Utilizator catalina5catalina serban catalina5 Data 21 octombrie 2009 16:31:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<iostream.h>
#include<fstream.h>

using namespace std;

int n,m,ok,q,w,max1,arb[500001];
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int maxf(int a,int b) {
    return (a>b)?a:b;
}

void constr(int nod,int st,int dr) {
    if(st>dr)
        return;
    if(st==dr) {
        arb[nod]=w;
        return;
    }
    int mij=(st+dr)>>1;
    if(q<=mij)
        constr(nod<<1,st,mij);
    else
        constr((nod<<1)+1,mij+1,dr);
    arb[nod]=maxf(arb[nod<<1],arb[(nod<<1)+1]);

}
 void query(int nod,int st,int dr) {
    if(q<=st&&w>=dr) {
        if(max1<arb[nod])
            max1=arb[nod];
        return;
    }
    int mij=(st+dr)>>1;
    if(q<=mij)
        query(nod<<1,st,mij);
    if(mij<w)
        query((nod<<1)+1,mij+1,dr);
}

void citire () {
        fin>>n>>m;
        for(int i=1;i<=n;i++){
            fin>>w;
            q=i;
            constr(1,1,n);
        }
        for(int j=0;j<m;j++) {
            fin>>ok>>q>>w;
            if(ok==0) {
                max1=-1;
                query(1,1,n);
                fout<<max1<<"\n";
            }
            else{
                //a[q]=w;
                constr(1,1,n);
            }
        }
}

int main() {
    citire();
    fin.close();
    fout.close();
    return 0;
}