Cod sursa(job #3200332)

Utilizator SimifilLavrente Simion Simifil Data 4 februarie 2024 13:08:54
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.83 kb
#include <iostream>
#include <algorithm>
#include <cmath>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m;
const int maxn = 5;
int v[maxn+1];
const int b_size = sqrt(maxn);
const int b_num = (maxn + b_size - 1) / b_size;
int batog[b_num];

#define UPDATE 1
#define QUERY 0

int First_inter( int a )
{
    return (a + b_size - 1) / b_size * b_size;
}

int Last_inter( int a )
{
    return a / b_size * b_size;
}

void build()
{
    for( int i = 0; i < n; ++i )
    {
        batog[ i / b_size ] = max( batog[ i / b_size ], v[i] );
    }
}

void querry( int a, int b )
{
    /*
    if( b >= batog[ a / b_size ] )
    {
        batog[ a / b_size ] = b;
    }
    else
    {
    */
    int first_inter = First_inter( a );
    int last_inter = Last_inter( b );
    //fout << "first_inter: " << first_inter << ", last_inter: " << last_inter << '\n';

    int left = a, right = b;
    int result = -1;
    while( left <= right && left < first_inter )
    {
        //fout << "left: " << left << " " << v[left] << '\n';
        result = max( result, v[left] );
        left++;
    }
    while( right >= left && right >= last_inter )
    {
        //fout << "right: " << right << " " << v[right] << '\n';
        result = max( result, v[right] );
        right--;
    }
    first_inter = first_inter / b_size;
    last_inter = last_inter / b_size;
    while( first_inter < last_inter )
        result = max( result, batog[ first_inter ] ), ++first_inter;
    //for( int i = 0; i < b_num; ++i )
    //    fout << batog[ i ] << " ";
    //for( int i = 0; i < n; ++i )
    //    fout << v[i] << " ";
    //fout << '\n';
    fout << result << '\n';
}

void update( int a, int b )
{
    if( b >= batog[ a / b_size ] )
    {
        //fout << "CAZ1";
        batog[ a / b_size ] = b;
    }
    else
    {
        v[a] = b;
        batog[ a / b_size ] = -1;
        for( int i = a; i <= b; ++i )
        {
            batog[ i / b_size ] = max( batog[ i / b_size ], v[i] );
        }
        /*
        fout << "CAZ2";
        int myb = a / b_size;
        fout << " " << myb << " ";
        for( int i = 0; i < b_size; ++i )
        {
            fout << myb * b_size + i << " ";
            if( myb * b_size + i < n )
                batog[ myb ] = max( batog[ myb ], v[ myb * b_size + i ] );
        }
        */
    }

}

int main()
{
    fin >> n >> m;
    for( int i = 0; i < n; ++i)
        fin >> v[i];
    build();
    int op, a, b;
    for( int i = 1; i <= m; ++i )
    {
        fin >> op >> a >> b;
        if( op == QUERY )
            querry( a - 1, b - 1 );
        else
            update( a - 1, b );

    }
    /*
    for( int i = 0; i < b_num; ++i )
        fout << batog[i] << " ";
    */
    return 0;
}