Cod sursa(job #2989738)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 6 martie 2023 22:34:43
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <math.h>

#define NMAX 100001

using namespace std;

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

int n, m, v[NMAX], sq, batog_size, batog[400], interval;

void build_batog(){
    for(int i=0;i<n;i++){
      int j=i/sq;
      batog[j]=std::max(batog[j], v[i]);
    }
}

int query(int left, int right){
    int firstInterval = (left + sq - 1) / sq * sq;
    int lastInterval = right / sq * sq;
    int el_max=0;
    cout<<firstInterval<<" "<<lastInterval<<"\n";
    while(left<right&&left<firstInterval)
      el_max=std::max(el_max, v[left++]);
    while(right>=left&&right>=lastInterval)
      el_max=std::max(el_max, v[right--]);

    firstInterval/=sq;
    lastInterval/=sq;

    while(firstInterval<=lastInterval)
      el_max=std::max(el_max, batog[firstInterval++]);

    return el_max;
}

int main()
{
    fin>>n>>m;
    sq=sqrt(n);
    batog_size=(n+sq-1)/sq;

    for(int i=0;i<n;i++){
      fin>>v[i];
    }

    build_batog();

    int operatie, e1, e2;
    for(int i=0;i<m;i++){
      fin>>operatie>>e1>>e2;
      e1--;
      if(!operatie){
        e2--;
        fout<<query(e1, e2)<<"\n";
      }
      else{
          v[e1]=e2;
          interval=e1/sq;
          int left=interval*sq;
          int right=(interval+1)*sq-1;
          batog[interval]=0;
          while(left<=right)
            batog[interval]=std::max(batog[interval], v[left++]);
      }
    }


    return 0;
}