Cod sursa(job #3232708)

Utilizator AdrianadyyyIoana Adrian Adrianadyyy Data 1 iunie 2024 09:58:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

#define max_dim 100001

int numar_elemente, numar_interogari;
int ArboreMax[4*max_dim+66];
int stanga, dreapta, valoare, pozitie, val_maxima;

int CalculeazaMaxim(int primul, int al_doilea) {
  return primul > al_doilea ? primul : al_doilea;
}

void Actualizeaza(int nod, int capat_stanga, int capat_dreapta){
  if (capat_stanga == capat_dreapta)
  {
      ArboreMax[nod] = valoare;
      return;
  }
    
  int mijloc = (capat_stanga+capat_dreapta)/2;
  if (pozitie <= mijloc){
    Actualizeaza(2*nod, capat_stanga, mijloc);
  } else {
    Actualizeaza(2*nod+1, mijloc+1, capat_dreapta);
  }                   
    
  ArboreMax[nod] = CalculeazaMaxim(ArboreMax[2*nod], ArboreMax[2*nod+1]);
}

void Interogare(int nod, int capat_stanga, int capat_dreapta){
  if (stanga <= capat_stanga && capat_dreapta <= dreapta)
  {
    if (val_maxima < ArboreMax[nod]) val_maxima = ArboreMax[nod];
    return;
  }

  int mijloc = (capat_stanga+capat_dreapta)/2;
  if (stanga <= mijloc){
  Interogare(2*nod, capat_stanga, mijloc);
  } 
  if (mijloc < dreapta){
  Interogare(2*nod+1, mijloc+1, capat_dreapta);
  } 
}


int main(){
  int val, capat_stanga, capat_dreapta;
  
  f>>numar_elemente>>numar_interogari;
  for (int i = 1; i <= numar_elemente; i++)
  {
    f>>val;
    pozitie = i, valoare = val;
    Actualizeaza(1,1,numar_elemente);
  }   
  
  for (int j = 1; j <= numar_interogari; j++)
  {
    f>>val>>capat_stanga>>capat_dreapta;
    if (val == 0) 
    {
      val_maxima = -1;
      stanga = capat_stanga, dreapta = capat_dreapta;
      Interogare(1,1,numar_elemente);
      
      g<<val_maxima<<"\n";
    }
    else
    {
      pozitie = capat_stanga, valoare = capat_dreapta;
      Actualizeaza(1,1,numar_elemente);
    }
  }
}