Cod sursa(job #2901229)

Utilizator DafinaTrufasTrufas Dafina DafinaTrufas Data 13 mai 2022 13:45:13
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
using namespace std;

int pm[100001][20], a[100000], log2[100000], n;

void rmq(int n)
{
    int i, j;
    for (i = 0; i < n; i++)
      pm[i][0] = i;
    for (j = 1; 1 << j <= n; j++)
      for (i = 0; i + (1 << j) - 1 < n; i++)
        if (a[pm[i][j - 1]] < a[pm[i + (1 << (j - 1))][j - 1]]) pm[i][j] = pm[i][j - 1];
        else pm[i][j] = pm[i + (1 << (j - 1))][j - 1];
}

void log(int n)
{
    int lg = -1, p = 1, i;
    for(i = 1; i <= n; i++)
    {
        if(p == i)
        {
            log2[i] = ++lg;
            p *= 2;
        }
        else log2[i] = lg;
    }
}

int main()
{int i, m, x, y, k;
ifstream f("rmq.in");
ofstream g("rmq.out");
f >> n >> m;
for(i = 0; i < n; i++)
    f >> a[i];
rmq(n);
log(n);
for(i = 0; i < m; i++)
{
    f >> x >> y;
    x--;
    y--;
    k = log2[y - x + 1];
    if(a[pm[x][k]] < a[pm[y - (1 << k) + 1][k]])
        g << a[pm[x][k]] << '\n';
    else g << a[pm[y - (1 << k) + 1][k]] << '\n';
}
return 0;
}