Cod sursa(job #1963461)

Utilizator MaligMamaliga cu smantana Malig Data 12 aprilie 2017 15:51:56
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

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

const int NMax = 1e5 + 5;
const int sqMax = 1e3 + 5;
const int inf = 2e9 + 5;

int N,M;
int v[NMax],rmq[sqMax],sqBit[NMax];

int main() {
    in>>N>>M;

    int root = 1;
    while (root * root <= N) {++root;}
    --root;

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

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

        rmq[sq] = min(rmq[sq],v[i]);
        sqBit[i] = sq;
        if (i % root == 0) {
            ++sq;
        }
    }

    while (M--) {
        int a,b;
        in>>a>>b;

        int ans = inf,
            sq = sqBit[a],
            drA,stB;
        drA = min(b, sq * root);

        ++sq;
        while (sq * root < b) {
            ans = min(ans,rmq[sq++]);
        }
        stB = max(a, (sq-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';
    }

    in.close();out.close();
    return 0;
}