Cod sursa(job #2564583)

Utilizator flee123Flee Bringa flee123 Data 1 martie 2020 23:47:36
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int rmq[nmax][20], numere[nmax], n, m, logn;

void sparse()
{
    int i, j, z, t;
    for(j = 1; j <= logn; j++)
    {

        t = (1 << j);
        z = (1 << (j - 1));
        for(i = 0; i + t <= n; i++)
        {
           if(numere[rmq[i][j - 1]] < numere[rmq[i + z][j - 1]])
                rmq[i][j] = rmq[i][j - 1];
           else
                rmq[i][j] = rmq[i + z][j-1];
        }
    }
}

int get_lg(int nbr)
{
    int ans = 0;
    while(nbr > 1)
       nbr = (nbr >> 1), ans++;
    return ans;
}

int main()
{
    int i, x, y, k;
    fin >> n >> m;
    x = n;
    logn = get_lg(n);
    for(i = 0; i < n; i++)
        fin >> numere[i], rmq[i][0] = i;
    sparse();
    for(i = 0; i < m; i++)
    {
        fin >> x >> y;
        k = get_lg(y - x);
        fout << min(numere[rmq[x - 1][k]], numere[rmq[y - (1<<k)][k]]) << '\n';
    }
    return 0;
}