Cod sursa(job #634866)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 17 noiembrie 2011 18:54:22
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <stdio.h>

#define maxn 100005

int maximul[maxn*4+10];
int max,poz,val,c1,c2;

void react(int nod,int li, int ls){
      if(li==ls){
        maximul[nod]=val;
        return;
      }
      int mij=li+(ls-li)/2;
      //o iau prin stanga
      if(poz<=mij)react(2*nod,li,mij);
        else react(2*nod+1,mij+1,ls);//prin dreapta
      //reactualizez tot ce e mai sus de locul unde am introdu noua valoare
      //e maximul dintre cele doua intervale
      if(maximul[2*nod]>maximul[2*nod+1])maximul[nod]=maximul[2*nod];
        else maximul[nod]=maximul[2*nod+1];
}

void afla_maximul(int nod,int li, int ls){
    //daca intervalul li, ls e inclus in cel cautat, atunci incerc sa reactualizez maximul
    if(c1<=li && ls<=c2){
       if(maximul[nod]>max)max=maximul[nod];
       return;
    }
    //daca intervalul care ma intereseaza nu e inclus, inseamna ca e intersectie
     int mij=li+(ls-li)/2;
     if(c1<=mij)afla_maximul(2*nod,li,mij);
     if(c2>mij)afla_maximul(2*nod+1,mij+1,ls);
}

int main(){
    FILE *fin=fopen("arbint.in","r");
    FILE *fout=fopen("arbint.out","w");
    int i;
    int cod, a,b,m,n;
    fscanf(fin,"%d%d",&n,&m);
    //citesc vectorul
    for(i=1;i<=n;i++){
      poz=i;
      fscanf(fin,"%d",&a);
      val=a;
      react(1,1,n);//sunt in nodul 1 (adica intervalul 1,n), pe total vreau sa bag valoare a pe pozitia poz
      //vreau sa fac asta pastrand vectorul maximul actualizat
    }
    for(i=0;i<m;i++){
      fscanf(fin,"%d%d%d",&cod,&a,&b);
      if(cod==0){//deci afisare de maxim
          max=-1;//toate val sunt pozitive, e ok sa init cu -1
          //trebuie sa aflu unde in vector se afla intervalul a,b
          c1=a;
          c2=b;
          afla_maximul(1,1,n);
         fprintf(fout,"%d\n",max);//sunt pe locul 1, si intervalul este 1,n
      }else{//schimb valoare unui element
         poz=a;
         val=b;
         react(1,1,n);
      }
      
    }

return 0;
}