Cod sursa(job #1977790)

Utilizator MaligMamaliga cu smantana Malig Data 6 mai 2017 09:24:21
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

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

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

int N,M;
int v[NMax],rmq[NMax],bit[NMax];

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

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

    int i;
    for (i=1;i * root <= N;++i) {
        int st = (i-1) * root + 1, dr = i * root;

        rmq[i] = inf;
        for (int j=st;j <= dr;++j) {
            rmq[i] = min(rmq[i],v[j]);
            bit[j] = i;
        }
    }

    int j = N;
    while (bit[j] == 0) {
        bit[j--] = i;
    }

    /*
    for (int i=1;i <= N;++i) {
        cout<<bit[i]<<' ';
    }
    cout<<'\n'<<i<<'\n';
    //*/

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

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

        ++i;
        while (i < bit[b]) {
            ans = min(ans,rmq[i++]);
        }

        stB = max((i-1) * root + 1,a);

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

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

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

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