Cod sursa(job #1820614)

Utilizator vladm98Munteanu Vlad vladm98 Data 1 decembrie 2016 22:31:51
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>

using namespace std;
int v[200001], dp[21][200001], n, doi[24], m;
int main()
{
    ifstream fin ("rmq.in");
    ofstream fout ("rmq.out");
    fin >> n >> m;
    int i, put = 1, p = 0, a, b, dif, j;
    while (put < n)
    {
        put = put<<1;
        ++p;
    }
    doi[0] = 1;
    for (i = 1; i<=p; ++i)
        doi[i] = doi[i-1] << 1;
    for (i = 1; i<=n; ++i)
    {
        fin >> v[i];
        dp[i][0] = v[i];
    }
    for (i = n+1; i<=2*n; ++i)
        v[i] = dp[i][0] = 100001;
    for (i = 1; i<=n; ++i)
        for (j = 1; j<p; ++j)
            dp[i][j] = min(dp[i][j-1], dp[i+doi[j-1]][j-1]);
    for (i=0; i<m; ++i)
    {
        fin >> a >> b;
        dif = a-b;
        put = 1;
        p = 0;
        while (put<<1 < dif)
        {
            put = put<<1;
            ++p;
        }
        fout << min(dp[a][p], dp[b-put][p]) << '\n';
    }
    return 0;
}