Cod sursa(job #1945210)

Utilizator MaligMamaliga cu smantana Malig Data 29 martie 2017 13:26:57
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>

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

const int NMax = 1e5 + 5;
const int inf = 2e9 + 5;
typedef long long ll;

int N,M;
int v[NMax],lg[NMax],sq[1000],sqBit[NMax];

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

    lg[1] = 0;
    for (int i=2;i<=N;++i) {
        lg[i] = lg[i/2] + 1;
    }

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

    for (int i=1;i*root <= N;++i) {
        sq[i] = inf;
        for (int j=(i-1)*root+1;j <= i*root;++j) {
            sq[i] = min(sq[i],v[j]);
            sqBit[j] = i;
        }
    }

    for (int i=1;i<=M;++i) {
        int a,b;
        in>>a>>b;

        int j,drA,stB,ans = inf;
        j = sqBit[a];

        drA = min(b,j*root);

        ++j;
        while (j*root < b) {
            ans = min(ans,sq[j]);
            ++j;
        }

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

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

        out<<ans<<'\n';
    }
    in.close();out.close();
    return 0;
}