Cod sursa(job #3201543)

Utilizator SimifilLavrente Simion Simifil Data 8 februarie 2024 23:15:02
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int n, m;

int nrbatog, lunbatog;
const int maxn = 1e5, maxnum = 1e4;
int batog[ maxnum + 1 ], v[maxn + 1];

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

void mymax ( int a, int b )
{
    int maxx = 0;
    int caregrupra_a = a / lunbatog;
    for( int i = a; i < (caregrupra_a + 1) * lunbatog && i <= b; ++i )
        maxx = max( maxx, v[ i ] );
    int caregrupra_b = b / lunbatog;
    for( int i = b; i >= caregrupra_b * lunbatog && i >= a; --i )
        maxx = max( maxx, v[i] );
    
    for( int i = caregrupra_a + 1; i <= caregrupra_b - 1; ++i )
        maxx = max( maxx, batog[ i ] );

    g << maxx << '\n';
}

void myupdate( int a, int b )
{
    int caregrupa = a / lunbatog;
    if( batog[ caregrupa ] <= b )
    {
        batog[ caregrupa ] = b;
        v[a] = b;
    }
    else
    {
        v[a] = b;
        int maxx = 0;
        for( int i = 0; i < lunbatog; ++i )
        {
            maxx = max( maxx, v[ caregrupa * lunbatog + i ] );
        }
        batog[ caregrupa ] = maxx;
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    f.tie(nullptr);
    g.tie(nullptr);

    f >> n >> m;
    for( int i = 0; i < n; ++i )
    {
        f >> v[i];
    }
    lunbatog = sqrt( maxn );
    nrbatog = maxn / lunbatog;
    //cout << "lunbatog : " << lunbatog << '\n';
    //cout << "nrbatog : " << nrbatog << '\n';
    build();
    for( int i = 1; i <= m; ++i )
    {
        int o, a, b;
        f >> o >> a >> b;
        if( o == 0 )
        {
            mymax( a - 1, b - 1 );
        }
        else
        {
            myupdate( a - 1, b );
        }
    }
    return 0;
}