Cod sursa(job #1933294)

Utilizator MaligMamaliga cu smantana Malig Data 20 martie 2017 16:43:37
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
#include <queue>

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

const int NMax = 1e5 + 5;
const int inf = 1e9;

int N,M;
int v[NMax],mn[1000 + 5];

int main() {
    in>>N>>M;
    for (int i=1;i<=N;++i) {
        in>>v[i];
    }

    int root=1;
    for (;root*root<=N;++root) ;
    --root;

    for (int i=1;i*root<=N;++i) {
        mn[i] = inf;

        int lim = i*root;
        for (int j = (i-1)*root + 1; j <= lim;++j) {
            mn[i] = min(mn[i],v[j]);
        }
    }

    while (M--) {
        int a,b,drA,stB;
        in>>a>>b;
        int ans = inf;

        int i = 1;
        while (root*i < a) {
            ++i;
        }
        drA = min(b,i*root);

        ++i;
        while (i*root < b) {
            ans = min(ans,mn[i]);
            ++i;
        }
        stB = max(a,(i-1)*root + 1);

        for (int i=a;i<=drA;++i) {
            ans = min(ans,v[i]);
        }

        for (int i=stB;i<=b;++i) {
            ans = min(ans,v[i]);
        }

        out<<ans<<'\n';
    }

    return 0;
}