Cod sursa(job #2450325)

Utilizator FrostfireMagirescu Tudor Frostfire Data 22 august 2019 17:14:24
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <iostream>
#include <cmath>
#define inf 2000000000
#define NMAX 100000
#define SQRT 320

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n, m, val, k, v[NMAX+10], a[SQRT+10];

int main()
{
    f >> n >> m;
    int val = sqrt(n);
    for(int i=1; i<=val+5; i++) a[i] = inf;

    for(int i=1; i<=n; i++)
        {   f >> v[i];
            k = (i-1) / val + 1;
            a[k] = min(a[k], v[i]);
        }
    //for(int i=1; i<=k; i++) cout << a[i] << ' ';
    //cout << '\n';

    while(m--)
        {   int p1, p2, g1, g2, mini = inf;
            f >> p1 >> p2;
            g1 = (p1-1) / val + 1;
            g2 = (p2-1) / val + 1;
            if(g1 == g2) for(int i=p1; i<=p2; i++) mini = min(mini, v[i]);
            else
                {   for(int i=g1+1; i<g2; i++) mini = min(mini, a[i]);
                    int i = p1;
                    while(((i-1) / val + 1) == g1) mini = min(mini, v[i]), i++;
                    i = p2;
                    while(((i-1) / val + 1) == g2) mini = min(mini, v[i]), i--;
                }
            g << mini << '\n';
        }
    return 0;
}