Cod sursa(job #2976299)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 8 februarie 2023 21:39:14
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 100005;
const int LGMAX = 20;
int n, m;
int lg[NMAX], a[NMAX], lookup[NMAX][LGMAX];
void rmq()
{
    lookup[1][0] = 1;
    for (int i=2;i<=n;i++){
        lg[i] = lg[(i>>1)] + 1;
        lookup[i][0] = i;
    }

    for (int j=1;(1<<j)<=n;j++){
        for (int i=1;(i+(1<<j)-1)<=n;i++){
            if (a[lookup[i][j-1]] < a[lookup[i+(1<<(j-1))][j-1]])
                lookup[i][j] = lookup[i][j-1];
            else
                lookup[i][j] = lookup[i+(1<<(j-1))][j-1]; 
        }
    }
}
int query(int x, int y)
{
    int j = lg[y-x+1]; // j = 4-2+1 = lg[3] = 1
    if (a[lookup[x][j]] < a[lookup[y-(1<<j)+1][j]])
        return a[lookup[x][j]];
    else
        return a[lookup[y-(1<<j)+1][j]];
}
int main()
{
    fin >> n >> m;
    for (int i=1;i<=n;i++){
        fin >> a[i];
    }
    rmq();
    for (int i=1;i<=m;i++){
        int p, q;
        fin >> p >> q;
        fout << query(p, q) << '\n';
    }
    return 0;
}