Cod sursa(job #2564591)

Utilizator flee123Flee Bringa flee123 Data 1 martie 2020 23:58:58
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 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++)
            (numere[rmq[i][j - 1]] < numere[rmq[i + z][j - 1]]) ? (rmq[i][j] = rmq[i][j - 1]) : (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;
    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);
        (numere[rmq[x - 1][k]] < numere[rmq[y - (1<<k)][k]]) ? (fout << numere[rmq[x - 1][k]] << '\n') : (fout << numere[rmq[y - (1<<k)][k]] << '\n');
    }
    return 0;
}