Cod sursa(job #202461)

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

int arb[3*Nmax];
int N,M;
int A[Nmax],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)>>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];
    
}

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

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)
            fprintf(fout,"%d\n",query(1,1,N,a,b));    
        else{
            A[a] = b;
            modif(a);   
        }
    }
    
    fclose(fin);
    fclose(fout);
    return 0;

}