Cod sursa(job #3223334)

Utilizator SimifilLavrente Simion Simifil Data 13 aprilie 2024 09:47:19
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.61 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("arbore_de_intervale.in");
ofstream g("arbore_de_intervale.out");

int n, q;
const int maxn = 100000;
int arbore[4*maxn+1];
int v[maxn+1];

void build( int left, int right, int node )
{
    if( left == right ) /// am ajuns la o frunza fara urmas
    {
        arbore[node] = v[left];
        //g << "am ajuns la capat " << v[left] << " " << node << "\n";
    }
    else
    {
        int middle = left + (right - left)/2;
        //g << "interval " << left << " si " << middle << "\n";
        //g << "interval " << middle+1 << " si " << right << "\n";
        build( left, middle, node*2 );
        build( middle+1, right, 2*node+1 );
        arbore[node] = min( arbore[node*2], arbore[node*2+1] );
    }
}

void update( int left, int right, int node, int position, int value )
{
    if( left == right )
        arbore[node] = value;
    else
    {
        int middle = left + (right - left)/2;
        if( position <= middle ) /// intram in intervalul din stanga
            update( left, middle, node*2, position, value );
        else
            update( middle+1, right, node*2+1, position, value );
        arbore[node] = min( arbore[node*2], arbore[node*2+1] );
    }
}

int query( int left, int right, int node, int query_left, int query_right )
{
    if( query_left <= left && right <= query_right )
        return arbore[node];
    else
    {
        int middle = left + (right - left)/2;
        /*
        * * * * * * * * * * * * *
        |           |           |
            {   }
        */
        if( query_right <= middle )
            return query( left, middle, node*2, query_left, query_right );
        if( middle + 1 <= query_left )
            return query( middle+1, right, node*2+1, query_left, query_right );
        /*
        * * * * * * * * * * * * *
        |           |           |
            {             }
        */
        //int val = max( query( left, middle, node*2, query_left, query_right ), query( middle+1, right, node*2+1, query_left, query_right ));
        //g << "pe " << left << " " << right << " avem " << val << "\n";
        return min( query( left, middle, node*2, query_left, query_right ), query( middle+1, right, node*2+1, query_left, query_right ));
    }
}

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

    f >> n >> q;
    for( int i = 1; i <= n; ++i )
    {
        f >> v[i];
    }
    build( 1, n, 1 );
    for( int i = 1; i <= q; ++i )
    {
        int x, y;
        f >> x >> y;
        g << query( 1, n, 1, x, y ) << "\n";
    }

    return 0;
}