Cod sursa(job #2816567)

Utilizator Antonia_onisoruantonia onisoru Antonia_onisoru Data 11 decembrie 2021 16:19:40
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <cmath>

using namespace std;

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

const int MAXN = 100000;
const int MAXI = 316;
const int MAXB = ( MAXN + MAXI - 1 ) / MAXI;

int batog[MAXB];

int v[MAXN + 1];
int size_v;

void changeBatog( int poz, int val ){
  int interval, i;
  v[poz] = val;

  for( i = interval * MAXI; i < (interval + 1) * MAXI; i++)
    batog[interval] = max( v[i], batog[interval]);
}

int query( int left, int right ){
  int intervalLeft, intervalRight;
  int maxim;

  intervalLeft = ( left + MAXI ) / MAXI * MAXI;
  intervalRight =  right / MAXI * MAXI;

  maxim = -1;
  while( left < right && intervalLeft >= left ){
    maxim = max(v[left], maxim);
    left++;
  }

  while( right >= left && intervalRight <= right ){
    maxim = max(v[right], maxim);
    right--;
  }

  intervalLeft /= MAXI;
  intervalRight /= MAXI;

  while( intervalLeft <= intervalRight ){
    maxim = max( maxim, batog[intervalLeft]);
    intervalLeft++;
  }

  return maxim;
}

int main(){
  int n, m, i, c, a, b;
  in>>n>>m;
  for(i = 1; i <= n; i++ ){
    in>>v[i];
    batog[i % MAXI] = max( v[i], batog[i % MAXI]);
  }

  for(i = 0; i < m; i++ ){
    in>>c>>a>>b;

    if( c == 0 )
      out<<query(a, b)<<'\n';
    else
      changeBatog(a, b);
  }
  return 0;
}