Cod sursa(job #3369420)

Utilizator Alias47John Doe Alias47 Data 20 octombrie 2026 10:53:31
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vc;
typedef vector<vector<int>> matrix;
#define ft(n) for(ull i=1; i<=n; i++)
#define sp ' '
string file = "rmq";
ifstream f(file + ".in");
ofstream g(file + ".out");

int n, m, a, b, logn;
vector<int> v;
vector<vector<int>> dp;

void test()
{
    for (int i = 0; i <= logn; i++)
    {
        for (int j = 1; j <= n; j++)
            g << dp[i][j] << sp;
        g << endl;
    }
    g << endl;
}

void precalc()
{
    for (int j = 1; j <= n; j++)
        f >> dp[0][j]; //2^0 interval length
    for (int i = 1; i <= logn; i++)
        for (int j = 1; j <= n - (1 << i) + 1; j++)
            dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + (1 << (i - 1))]);
}

void rmq()
{
    int a, b;
    f >> a >> b;
    int log_interval = log2(b - a + 1); //2 overlapping or touching intervals of 2^log2 length
    int len_interval = (1 << log_interval);
    int res = min(dp[log_interval][a], dp[log_interval][b - len_interval + 1]);
    g << res << "\n";
}

int main()
{
    f >> n >> m;
    logn = log2(n);
    dp.resize(logn + 1, vc(n + 5, 0));
    precalc();
    for (int i = 1; i <= m; i++)
        rmq();
    return 0;
}