Cod sursa(job #145887)

Utilizator moga_florianFlorian MOGA moga_florian Data 29 februarie 2008 17:39:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<stdio.h>
#define Nmax 100005

int A[Nmax];
int arb[3*Nmax];
int poz[Nmax];

void init(int i, int li,int lf){

    if(li==lf){
        arb[i] = A[li];
        poz[li] = i;
        return;
    }
    
    int mij = (li+lf)/2;
    init(2*i,li,mij);
    init(2*i+1,mij+1,lf);
    
    arb[i] = arb[2*i];
    if(arb[2*i+1] > arb[i])
        arb[i] = arb[2*i+1];

}

int query(int i,int li,int lf,int a,int b){

    if(b<li || lf<a)
        return -1;

    if(a<=li && lf<=b)
        return arb[i];
        
    int mij = (li+lf) >> 1;
    int max1 = query(2*i,li,mij,a,b),
        max2 = query(2*i+1,mij+1,lf,a,b);
        
    if(max1 > max2)
        return max1;
    return max2;

}

int main(){

    FILE *fin = fopen("arbint.in","r"),
         *fout = fopen("arbint.out","w");
         
    int N,M;
    fscanf(fin,"%d%d",&N,&M);
    
    for(int i=1;i<=N;i++) fscanf(fin,"%d",&A[i]);
    
    init(1,1,N);
    
    for(int t=0;t<M;t++){
        int x,a,b;
        fscanf(fin,"%d%d%d",&x,&a,&b);
        if(x){
            arb[poz[a]] = b;
            int i = poz[a] / 2;
            while(i){
                arb[i] = arb[2*i];
                if(arb[2*i+1] > arb[i])
                    arb[i] = arb[2*i+1];
                i>>=1;
            }
            
        }
        else
            fprintf(fout,"%d\n",query(1,1,N,a,b));
    }
    
    fclose(fin);
    fclose(fout);
    return 0;

}