Cod sursa(job #1820693)

Utilizator vladm98Munteanu Vlad vladm98 Data 2 decembrie 2016 01:46:32
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>

using namespace std;
int v[200005], dp[40][200005], n, doi[40], m;
int minim (int a, int b)
{
    if (a>b)
        return b;
    return a;
}
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*2 < n)
    {
        put = put<<1;
        ++p;
    }
    doi[0] = 1;
    for (i = 1; i<=p; ++i)
        doi[i] = doi[i-1] << 1;
    for (i = n+1; i<=2*n; ++i)
        v[i] = dp[0][i] = 100001;
    for (j = 1; j<=p; ++j)
        for (i = n+1; i<=2*n; ++i)
            dp[j][i] = 100001;
    for (i = 1; i<=n; ++i)
    {
        fin >> v[i];
        if (i>=2)
            dp[0][i-1] = minim (v[i], v[i-1]);
    }
    dp[0][n] = v[n];
    for (i = 1; i<=p; ++i)
        for (j = 1; j<=n; ++j)
            if (j+doi[i-1] <= n) dp[i][j] = minim(dp[i-1][j], dp[i-1][j+doi[i-1]]);
    /*for (i = 1; i<=2*n; ++i)
    {
        for (j = 1; j<=p; ++j)
            fout << dp[i][j] << " ";
        fout << '\n';
    }*/
    for (i=0; i<m; ++i)
    {
        fin >> a >> b;
        if (a == b)
            fout << v[a] << '\n';
        else {
        dif = b-a+1;
        put = 1;
        p = 0;
        while (put*2< dif)
        {
            put = put<<1;
            ++p;
        }
        fout << minim(dp[p][a], dp[p][b-put]) << '\n';}
    }
    return 0;
}