Cod sursa(job #3130241)

Utilizator AdiFBubuBubuianu Adrian AdiFBubu Data 17 mai 2023 10:24:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int N, M;
int P[100005][20], A[100005];
int lg[100005];

void process2(int M[][20], int A[], int N)
{
    for(int i = 0; i < N; i ++)
        M[i][0] = i;
    for(int j = 1; (1 << j) <= N; j ++)
        for(int i = 0; i + (1 << j) - 1 < N; i ++)
            if(A[ M[i][j - 1] ] < A[ M[i + (1 << (j - 1)) ][j - 1] ])
                M[i][j] = M[i][j - 1];
            else
                M[i][j] = M[i + (1 << (j - 1)) ][j - 1];
}


int main()
{
    f >> N >> M;
    for(int i = 0; i < N; i ++)
        f >> A[i];
    process2(P, A, N);
    lg[1] = 0;
    for(int i = 2; i <= N; i ++)
        lg[i] = lg[i / 2] + 1;

    for(int i = 1; i <= M; i ++)
    {
        int x, y;
        f >> x >> y;
        x --, y --;
        int k = lg[y - x + 1];
        g << min(A[P[x][k]], A[P[y - (1 << k) + 1][k]] ) << '\n';
    }
    return 0;
}