Cod sursa(job #2947742)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 26 noiembrie 2022 17:36:44
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

const int NMAX = 100000;
int radical, n;
int v[NMAX+1], batog[320];

int getblock( int a ){
    return a / radical;
}
int maxim( int st, int dr){
    int a = getblock( st ) , b = getblock( dr ) , maxi = 0 , j;
    if( a == b ){
        for( j = st ; j <= dr ; j++)
            maxi = max(maxi, v[j]);
    }
    else{
        int fin = min( radical * ( a + 1 ) , n);
        for( j = st ; j < fin ; j++ )
            maxi = max( maxi , v[j]);
        for( j = a + 1 ; j < b ; j++ )
            maxi = max( maxi, batog[j]);
        for( j = dr ; j >= radical * b; j-- )
            maxi = max( maxi, v[j]);
    }
    return maxi;
}

void inlocuire( int poz, int val){
    int st = getblock( poz ) , maxi = 0 , j;
    int fin = min( radical * ( st + 1 ) , n);
    v[poz] = val;
    for( j = radical * st ; j < fin; j++ )
        batog[st] = max( maxi , v[j]);
}

int main()
{
    ifstream in("arbint.in");
    ofstream out("arbint.out");
    int m, a, b, i, cer;
    in >> n >> m;
    radical = sqrt(n);
    for( i = 0; i < n ; i++ ){
      in >> v[i];
      batog[getblock(i)] = max( batog[getblock(i)] , v[i]);
    }
    for( i = 0 ; i < m ; i++ ){
      in >> cer >> a >> b;
      a--;
      if( cer == 0 )
        out << maxim( a , b-1 ) << endl;
      else
        inlocuire( a , b );
    }
    return 0;
}