Cod sursa(job #1425990)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 28 aprilie 2015 18:33:06
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100001
int v[4*MAXN],maxim;
inline int max(int a,int b){
    if(a>b) return a;
    return b;
}
void update(int nod,int l,int r,int x,int poz){
     int mij;
     if(l==r)
         v[nod]=x;
     else{
         mij=(l+r)/2;
         if(mij<poz) update(2*nod+1,mij+1,r,x,poz);
         else update(2*nod,l,mij,x,poz);
         v[nod]=max(v[2*nod],v[2*nod+1]);
     }
}
void querry(int nod,int l,int r,int a,int b){
    int mij;
    if(a<=l&&r<=b){
        if(maxim<v[nod])
           maxim=v[nod];
    }
    else{
        mij=(l+r)/2;
        if(mij<b) querry(2*nod+1,mij+1,r,a,b);
        if(mij>=a) querry(2*nod,l,mij,a,b);
    }
}
int main(){
    FILE*fi,*fout;
    int n,m,a,b,t,i,x,j;
    fi=fopen("arbint.in" ,"r");
    fout=fopen("arbint.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&m);
    for(i=0;i<n;i++){
        fscanf(fi,"%d" ,&x);
        update(1,1,n,x,i+1);
    }
    for(i=0;i<m;i++){
        fscanf(fi,"%d%d%d" ,&t,&a,&b);
        if(t==0){
            maxim=0;
            querry(1,1,n,a,b);
            fprintf(fout,"%d\n" ,maxim);
        }
        else
            update(1,1,n,b,a);
    }
    fclose(fi) ;
    fclose(fout);
    return 0;
}