Cod sursa(job #3263349)

Utilizator NemiNeemia Nemi Data 14 decembrie 2024 10:48:51
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");


int p2[100010];
int rmq[10020][20];
int v[100020];


int main()
{
    int n, m, x, y;
    fin >> n >> m;

    for(int i = 1; i <= n; i++){
        fin >> v[i];
        rmq[i][0] = v[i];
    }

    int doi = 0;
    for(int i = 1; i <= n; i++){
        if((1 << (doi + 1)) <= i)
            doi++;
        p2[i] = doi;
    }

    for(int j = 1; j <= p2[n]; j++){
        for(int i = 1; i + p2[j] <= n; i++)
            rmq[i][j] = min(rmq[i][j - 1],rmq[i+(1<<(j - 1))][j-1]);
    }

    for(int j = 1; j <= m; j++){
        fin >> x >> y;

        int l = y - x + 1;
        l = p2[l];
        fout << min(rmq[x][l],rmq[y-(1<<l)+1][l]) << endl;
    }

    return 0;
}