Cod sursa(job #2550556)

Utilizator MAF10000nu va dau numele MAF10000 Data 18 februarie 2020 21:02:44
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <iostream>
#include <cstdio>

using namespace std;
int v[100001],arbore[200002],k,n,maxim,m,maximul,c,d,x,k2;


void care_imaximul(int l,int st,int dr,int a ,int b){
    if(l<=k){
    if(a==st && b==dr){
            maximul=arbore[l];
}
    if(st<=a || b<=dr){
        care_imaximul(2*l,st,(st+dr)/2,a,b);
        care_imaximul(2*l+1,(st+dr)/2+1,dr,a,b);
    }


    if(a<=st && dr<=b){
        if(arbore[l]>maximul){
            maximul=arbore[l];
        }
    }
}}

void facem_arborele(int l,int a,int b){
    k++;maxim=-1;
    for(int i=a;i<=b;i++){
        if(v[i]>maxim){
            maxim=v[i];
        }
    }
    arbore[l]=maxim;
if(a!=b){
        facem_arborele(2*l,a,(a+b)/2);
        facem_arborele(2*l+1,(a+b)/2+1,b);
}
}
void actualizare(int l,int st,int dr, int a,int b){          //ACTUALIZEAZA ASTA DOAR CU UN NUMAR DIN SIR!!!
                                                            // fa arbore cand scoti maximul si nu il poti inlocui cu celalalt!
    if(l<=k2){
        if(st<=a && a<=dr){
            if(v[a]>arbore[l]){
                arbore[l]=v[a];
            }
            if(arbore[l]==v[b]&& (st>b || b>dr)){
                    k=l-1;
                facem_arborele(l,st,dr);
            }
        }
        if(st<=b && b<=dr){
            if(v[b]>arbore[l]){
                arbore[l]=v[b];
            }
            if(arbore[l]==v[a]&& (st>a || a>dr)){
                    k=l-1;
                facem_arborele(l,st,dr);
            }
        }
        if((st<=a && a<=dr)|| (st<=b && b<=dr)){
            actualizare(2*l,st,(st+dr)/2,a,b);
            actualizare(2*l+1,(st+dr)/2+1,dr,a,b);
        }
}

}

int main()
{
    FILE*in =fopen("arbint.in","r");
    FILE*out=fopen("arbint.out","w");

    fscanf(in,"%d%d",&n,&m);

    for(int j=1;j<=n;j++){
        fscanf(in,"%d",&v[j]);
    }
    facem_arborele(1,1,n);

    //fscanf(in,"%d%d",&c,&d);
    maximul=0;
    k2=k;
    while(m!=0){
        fscanf(in,"%d",&x);
        m--;

        if(x==0){
        maximul=0;
        fscanf(in,"%d%d",&c,&d);

        care_imaximul(1,1,n,c,d);
        fprintf(out,"%d\n",maximul);
        }
        if(x==1){
            fscanf(in,"%d%d",&c,&d);
            v[c]=d;

            //actualizare(1,1,n,c,d);
            k=0;
            facem_arborele(1,1,n);
         //   fprintf(out,"ARBORE\n");
      //      for(int i=1;i<=k;i++){
  //  fprintf(out,"%d\n",arbore[i]);}
        }
    }
    fclose(in);
    fclose(out);
}