Cod sursa(job #1875772)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 11 februarie 2017 15:48:12
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<fstream>

#define MAX 100001
using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n, m, lg[MAX], v[20][MAX], i, j, k, a[MAX], l;

int main()
{
    fin>>n>>m;
    for (i = 0; i < n; i++)
    {
        fin>>a[i];
        v[0][i] = a[i];
    }

    lg[1] = 0;
    for (i = 2; i <=n; i++)
        lg[i] = lg[i/2] + 1;

    //preprocesare
    for (j = 1; (1 << j) <= n; j++)
    {
        i = 0;l = 1 << (j-1);
        while(i + 2 * l <= n)
        {
            if (v[j - 1][i] < v[j - 1][i + l]) v[j][i] = v[j - 1][i];
            else v[j][i] = v[j - 1][i + l];

            i++;
        }
    }

    for (i = 1; i <= m; i++)
    {
        fin>>j>>k;
        j--;k--;
        l = lg[k - j + 1];
        if (v[l][j] < v[l][k - (1 << l) + 1]) fout<<v[l][j]<<'\n';
        else fout<<v[l][k - (1 << l) + 1]<<'\n';
    }
    return 0;
}