Cod sursa(job #2899304)

Utilizator RobertuRobert Udrea Robertu Data 8 mai 2022 14:51:21
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int dim = 1e5 + 2;
int v[dim], n;

int getLog(int n) {
    int lg = -1, pw = 1;

    for(int i = 1; i <= n; i++) {
        if(pw == i) {
            lg++;
            pw *= 2;
        }
    }
    return lg;
}
int sparseTable[100002][18];

int rmq(int st, int dr) {
    int l = dr - st + 1;
    int k = getLog(l);      

    return min(v[ sparseTable[st][k] ], v[ sparseTable[st + l - (int)pow(2, k)][k] ]);
}

int main() {
    int k;
    fin >> n >> k;

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

    for(int i = 0; i < n; i++) 
        sparseTable[i][0] = i;

    int p2 = 2; //2^j
    for(int j = 1; p2 <= n; j++) {
        for(int i = 0; i + p2 - 1 < n; i++) {
            if(v[ sparseTable[i][j - 1] ] < v[ sparseTable[i + p2/2][j - 1] ])
                sparseTable[i][j] = sparseTable[i][j - 1];
            else sparseTable[i][j] = sparseTable[i + p2/2][j - 1];
        }

        p2 *= 2;
    }

    int st, dr;
    for(int i = 0; i < k; i++) {
        fin >> st >> dr;

        fout << rmq(--st, --dr) << '\n';
    }

    fin.close();
    fout.close();
    return 0;
}