Cod sursa(job #2551393)

Utilizator MAF10000nu va dau numele MAF10000 Data 19 februarie 2020 19:56:15
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 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){

    if(st!=dr){

        if(a<=(st+dr)/2){
            actualizare(2*l,st,(st+dr)/2,a);
        }
        else{actualizare(2*l+1,(st+dr)/2+1,dr,a);}}

    if(st==dr){
            arbore[l]=v[a];}

        else{
            if(arbore[2*l]>arbore[2*l+1]){
                arbore[l]=arbore[2*l];
            }
            else{
                arbore[l]=arbore[2*l+1];
            }
        }


}

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);

    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);
            //int  r=v[c];
            v[c]=d;
          //  k=0;
         //   k2=0;
            actualizare(1,1,n,c);

        }
    }
    fclose(in);
    fclose(out);
}