Cod sursa(job #202462)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 8 august 2008 18:13:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<stdio.h>
#define Nmax 100024

int arb[3*Nmax];
int N,M;
int A[Nmax],poz[Nmax];
int MAX;

void init(int i, int li, int lf){
 
    if(li==lf){
        arb[i] = A[li];
        poz[li] = i;
        return;
    }
    
    int mij = (li+lf)>>1;
    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];
    
}

void query(int i,int li, int lf, int a, int b){
 
    if(lf<a || b<li) // intervalele nu se intersecteaza
        return;
    
    if(a<=li && lf<=b){ //li,lf este inclus in a,b
        if(arb[i]>MAX)
            MAX=arb[i];
        return;
    }
    
    int mij = (li+lf)/2;
    query(2*i,li,mij,a,b);
    query(2*i+1,mij+1,lf,a,b);
        
}

void modif(int k){
    int i = poz[k];
    arb[i] = A[k];
    i/=2;
    
    while(i){
        if(arb[2*i] > arb[2*i+1])
            arb[i] = arb[2*i];
        else
            arb[i] = arb[2*i+1];
        i/=2;
    }
}

int main(){

    FILE *fin = fopen("arbint.in","r"),
         *fout = fopen("arbint.out","w");
         
    fscanf(fin,"%d%d",&N,&M);
    for(int i=1;i<=N;i++)
        fscanf(fin,"%d",&A[i]);
        
    init(1,1,N);
    
    for(int i=1;i<=M;i++){
        int v,a,b;
        fscanf(fin,"%d%d%d",&v,&a,&b);
        if(!v){
            MAX=-1;
            query(1,1,N,a,b);
            fprintf(fout,"%d\n",MAX);                
        }
        else{
            A[a] = b;
            modif(a);   
        }
    }
    
    fclose(fin);
    fclose(fout);
    return 0;

}