Cod sursa(job #1752551)

Utilizator meriniucrMeriniuc Razvan- Dumitru meriniucr Data 4 septembrie 2016 13:48:22
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>

int d[100001][20];
int arr[100001];
int lg[100001];

int main()
{
    std::ifstream mama("rmq.in");
    std::ofstream tata("rmq.out");
    int n;
    int m;
    int i;
    int j;
    int k;
    int temp;

    mama >> n >> m;
    for (i = 1; i <= n; ++i)
    {
        mama >> arr[i];
    }

    for (i = 1; i <= n; ++i)
    {
        d[i][0] = arr[i];
    }

    lg[1] = 0;
    for (i = 2; i <= n; ++i)
    {
        lg[i] = lg[i >> 1] + 1;
    }

    for (i = 1; (1 << i) <= n; ++i)
    {
        for (j = 1; j <= n; ++j)
        {
            if (i + j > n)
            {
                break;
            }

            d[j][i] = std::min(d[j][i - 1],
                               d[j + (1 << (i - 1))][i - 1]);
        }
    }

    for (k = 0; k < m; ++k)
    {
        mama >> i >> j;

        temp = j - i + 1;
        tata << std::min(d[i][lg[temp]],
                         d[j - (1 << lg[temp]) + 1][lg[temp]]) << '\n';
    }
}