Cod sursa(job #1912820)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 8 martie 2017 10:49:33
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int oo = 200000000;
int n, m, a,b;
int v[100010], rmq[1500], key, crmin, keya, keyb;


int main()
{
    fin >> n >> m;
    key = 1;
    while(key*key <= n) key++;
    for(int i=0; i<1400; i++)
        rmq[i] = oo;
    for(int i=0; i<n; i++)
    {
        fin>>v[i];
        rmq[v[i]/key] = min(rmq[v[i]/key], v[i]);
    }
    while(m--)
    {
        fin >> a >> b;
        a--; b--;
        crmin = oo;
        if(a/key == b/key)
        {
            //fout<<"a/key == b/key: ";
            while(a!=b)
            {
                //fout<<'\n'<<"a: "<<a<<"->"<<v[a]<<'\n';
                crmin = min(crmin, v[a]);
                a++;
            }
        }
        else
        {
            //fout<<"a/key != b/key: ";
            keya = a/key; keyb = b/key;
            while(a/key == keya)
            {
                //fout<<'\n'<<"a: "<<a<<"->"<<v[a]<<'\n';
                crmin = min(crmin, v[a]);
                a++;
            }
            while(b/key == keyb)
            {

                //fout<<'\n'<<"b: "<<b<<"->"<<v[b]<<'\n';
                crmin = min(crmin, v[b]);
                b--;
            }
            keya++; keyb--;
            //if(keya <= keyb) fout<<"inter Key: ";
            while(keya <= keyb)
            {
                //fout<<'\n'<<"key: "<<keya<<"->"<<rmq[keya]<<'\n';
                crmin = min(crmin, rmq[keya]);
                keya++;
            }
        }
        fout<<crmin<<'\n';
    }

    return 0;
}