Cod sursa(job #2561384)

Utilizator MAF10000nu va dau numele MAF10000 Data 28 februarie 2020 19:20:42
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <iostream>
#include <cstdio>
#include <fstream>

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(a<=st && dr<=b){
        if(arbore[l]>maximul){
            maximul=arbore[l];
        }
    }
    else{
    if(b<st || a>dr){
    }
    else{
        care_imaximul(2*l,st,(st+dr)/2,a,b);
        care_imaximul(2*l+1,(st+dr)/2+1,dr,a,b);
    }
    }


}}

void facem_arborele(int l,int a,int b){
    k++;
    if(a==b){
        arbore[l]=v[a];
    }
if(a!=b){
        facem_arborele(2*l,a,(a+b)/2);
        facem_arborele(2*l+1,(a+b)/2+1,b);
        if(arbore[2*l]>arbore[2*l+1]){
            arbore[l]=arbore[2*l];
        }
        else{
            arbore[l]=arbore[2*l+1];
        }
}
}
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()
{
    ifstream in ("arbint.in");
    ofstream out ("arbint.out");
   // FILE*in =fopen("arbint.in","r");
 //   FILE*out=fopen("arbint.out","w");

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

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

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

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

        }
    }
    in.close();
    out.close();
}