Cod sursa(job #1991095)

Utilizator MaligMamaliga cu smantana Malig Data 15 iunie 2017 08:02:55
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stack>
#include <cstring>

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

#define ll long long
#define pb push_back
const int inf = 1e9 + 5;
const int NMax = 1e5 + 5;

int N,M,nrSq;
int v[NMax],rmq[NMax],pos[NMax];

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

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

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

    nrSq = 0;
    for (int i=1;i <= N;++i) {
        if (i % root == 1) {
            ++nrSq;
        }
        rmq[nrSq] = min(rmq[nrSq],v[i]);
        pos[i] = nrSq;
    }

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

        int idxA = pos[a],idxB = pos[b],
            drA,stB;
        drA = min(b,root*idxA);
        stB = max(a,(idxB-1)*root + 1);

        int ans = inf;
        for (int i = idxA+1;i < idxB;++i) {
            ans = min(ans,rmq[i]);
        }

        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;
}