Cod sursa(job #2337857)

Utilizator victorv88Veltan Victor victorv88 Data 6 februarie 2019 19:15:58
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define VAL_MAX 0x3f3f3f3f
using namespace std;

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

int n, m, initial_array[100005], root_array[320], size_root;

void citire()
{
    int x, ind, ind_root=1;
    f >> n >> m;
    size_root=(int)sqrt(n);
    int val_min=VAL_MAX;
    for ( ind=1; ind<=n; ind++)
    {
        f >> initial_array[ind];

        if (initial_array[ind]<val_min)
        {
            val_min=initial_array[ind];
        }
        if (ind%size_root==0)
        {
            root_array[ind_root++]=val_min;
            val_min=VAL_MAX;
        }
    }
    if (val_min!=VAL_MAX)
        root_array[ind_root++]=val_min;
/*    for (int i=1; i<ind_root; ++i)
    {
        cout << root_array[i] <<'\n';
    }*/
}

int find_min (int st, int dr)
{
    int mini=VAL_MAX;
    while (dr%size_root!=0 && st<=dr)
    {
        mini=min(mini,initial_array[dr]);
        dr--;
    }
    while (st+size_root<=dr && dr%size_root==0)
    {
        mini=min(mini,root_array[dr/size_root]);
        dr-=size_root;
    }
    while (st<=dr)
    {
        mini=min(mini,initial_array[dr]);
        dr--;
    }

    return mini;
}

void solve()
{
    int st, dr;
    for (int query=0; query<m; ++query)
    {
        f >> st >> dr;
        g << find_min(st,dr) << '\n';
    }
}

int main() {
    citire();
    solve();
    return 0;
}