Cod sursa(job #2755252)

Utilizator iustin.pericicaPericica Iustin iustin.pericica Data 26 mai 2021 22:06:31
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int m, n;
int arborebinar[400100];
int start, finish;
int val, pos;
int maxim;


void Update(int nod, int stanga, int dreapta){
     if (stanga == dreapta){
          arborebinar[nod] = val;
     }

     int div = (dreapta+stanga)/2;
     if (div >= pos) Update(2*nod,stanga,div);
     else   Update(2*nod+1,div+1,dreapta);

     if(arborebinar[2*nod] > arborebinar[2*nod+1]){
        arborebinar[nod] = arborebinar[2*nod];
     }
     else{
        arborebinar[nod] = arborebinar[2*nod + 1];
     }
}



void Query(int nod, int stanga, int dreapta){
     if (stanga >= start && dreapta <= finish)
     {
          if (maxim < arborebinar[nod]) maxim = arborebinar[nod];
          return;
     }

     int div = (stanga+dreapta) / 2;
     if (start <= div) Query(2*nod, stanga, div);
     if (finish > div) Query(2*nod + 1,div +  1, dreapta);
}

int main()
{
    int x, a, b;


    fin>>n>>m;
    for (int i = 1; i <= n; i++){
        fin>>x;
        pos = i;
        val = x;
        Update(1,1,n);
    }

    for (int i = 1; i <= m; i++){
        fin>>x>>a>>b;
        if (x == 0){
             maxim = -1;
             start = a;
             finish = b;
             Query(1,1,n);
             fout<<maxim<<endl;
        }
        else{
            pos = a;
            val = b;
            Update(1,1,n);
        }
    }
}