Cod sursa(job #1356751)

Utilizator jordasIordache Andrei Alexandru jordas Data 23 februarie 2015 16:09:55
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <cmath>
#define nMax 100001

using namespace std;

 ifstream x ("rmq.in");
 ofstream y ("rmq.out");

 int n,m;
 int a[nMax];

int main()
{
    int i,j,k;

    x>>n>>m;

    for(i=1;i<=n;i++)
       x>>a[i];

    int c=1;

    while(c*c<n)
       c++;

    c--;

    //c=int(sqrt(n));

    int mask[c+1];

    for(j=0;j<=c;j++)
       mask[j]=100000;

    //y<<c<<'\n';

    k=0;
    i=0;

    while(i+c<=n)
    {
        k++;

        for(j=1;j<=c;j++)
           mask[k]=min(mask[k],a[i+j]);

        i+=c;
    }
/*
    for(i=1;i<=c;i++)
       y<<mask[i]<<' ';
    y<<'\n';
    y<<c<<"\n\n";
*/

    int minn;

    int l,r;

    for(i=1;i<=m;i++)
    {
        x>>l>>r;

        minn=100000;

        while(l<=r)
        {
            if((l-1)%c==0 && l+c<=r)
            {
                l+=c;
                minn=min(minn,mask[(l-1)/c]);
            }
            else
            {
                minn=min(minn,a[l]);
                l++;
            }
        }

        y<<minn<<'\n';
    }

    return 0;

}