Cod sursa(job #1207703)

Utilizator sddddgjdZloteanu Anastasia sddddgjd Data 13 iulie 2014 17:28:38
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.32 kb
#include<stdio.h>
int arbint[1000001],max;

inline int maxof2(int a,int b){
    if(a<b)
        return b;
    return a;
}

void up(int nod, int left, int right,int v,int p){
     if(left==right)
          arbint[nod]=v;
     else{
        int mij=(left+right)/2;
        if(p<=mij)
            up(2*nod,left,mij,v,p);
        else
            up(2*nod+1,mij+1,right,v,p);
        arbint[nod]=maxof2(arbint[2*nod+1],arbint[2*nod]);
     }
}

void getans(int nod, int left, int right,int st,int dr){
     if(right<=dr&&st<=left){
          if(max<arbint[nod])
            max=arbint[nod];
     }
     else{
        int mij=(left+right)/2;
        if(st<=mij)
            getans(2*nod,left,mij,st,dr);
        if(mij<dr)
            getans(2*nod+1,mij+1,right,st,dr);
     }
}

int main(){
    FILE *fin,*fout;
    fin=fopen("arbint.in","r");
    fout=fopen("arbint.out","w");
    int n,m;
    fscanf(fin,"%d%d",&n,&m);
    int i;
    for(i=1;i<=n;i++){
        int x;
        fscanf(fin,"%d",&x);
        up(1,1,n,x,i);
    }
    for(i=1;i<=m;i++){
        int x,a,b;
        fscanf(fin,"%d%d%d",&x,&a,&b);
        if(x==0){
             max=-1;
             getans(1,1,n,a,b);
             fprintf(fout,"%d\n",max);
        }
        else
            up(1,1,n,b,a);
    }
    return 0;
}