Cod sursa(job #3279351)

Utilizator SimifilLavrente Simion Simifil Data 22 februarie 2025 17:26:46
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int main()
{
    int n, m, dp[100001][20], logaritmi[100001];
    memset( logaritmi, -1, sizeof(logaritmi) );
    for( int i = 0; (1<<i) <= 100000; ++i )
    {
        logaritmi[1<<i] = i;
    }
    for( int i = 1; i <= 100000; ++i )
    {
        if( logaritmi[i] == -1 )
            logaritmi[i] = logaritmi[i-1];
    }
    f >> n >> m;
    for( int i = 1; i <= n; ++i )
    {
        f >> dp[i][0];
    }
    for( int i = 1; (1<<i) <= n; ++i )
    {
        for( int j = 1; j + (1<<(i-1)) <= n; ++j )
        {
            dp[j][i] = min(dp[j][i-1], dp[j+(1<<(i-1))][i-1]);
        }
    }
    for( int i = 1; i <= m; ++i )
    {
        int x, y;
        f >> x >> y;
        g << min( dp[x][logaritmi[y-x+1]], dp[y-logaritmi[y-x+1]][logaritmi[y-x+1]] ) << "\n";
    }
    return 0;
}