Cod sursa(job #1785658)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 21 octombrie 2016 19:25:11
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 100001
#define SMAX 317

using namespace std;

ifstream in("rmq.in");
ofstream out("rmq.out");
int A[NMAX], n, m, poz[NMAX];
int A_MIN[SMAX], dx[SMAX], dy[SMAX];

int main()
{
    in >> n >> m;
    for (int i = 1; i <= n; ++i)
        in >> A[i];
    int piece, length = sqrt(n);
    int L = length;
    if ((double) L < sqrt(n))
        L++;
    for (int i = 0; i < L - 1; ++i)
    {
        A_MIN[i] = NMAX;
        dx[i] = i * length + 1;
        dy[i] = dx[i] + length - 1;
    }
    A_MIN[L - 1] = NMAX;
    dx[L - 1] = (L - 1) * length + 1;
    dy[L - 1] = n;
    for (int i = 1; i <= n; ++i)
    {
        piece = (i - 1) / length;
        A_MIN[piece] = min(A_MIN[piece], A[i]);
        poz[i] = piece;
    }
    int x, y, minn, bucx, bucy;
    for (int i = 1; i <= m; ++i)
    {
        in >> x >> y;
        bucx = poz[x];
        bucy = poz[y];
        minn = A[x];
        if (bucx != bucy)
        {
            for (int j = x; j < dy[bucx]; ++j)
                minn = min(minn, A[j]);
            for (int j = dx[bucy]; j <= y; ++j)
                minn = min(minn, A[j]);
        }
        else
            for (int j = x; j <= y; ++j)
                minn = min(minn, A[j]);
        for (int j = bucx + 1; j < bucy; ++j)
            minn = min(minn, A_MIN[j]);
        out << minn << "\n";
    }
    in.close();
    out.close();
    return 0;
}