Cod sursa(job #1372213)

Utilizator horiainfoTurcuman Horia horiainfo Data 4 martie 2015 12:13:43
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <cstdio>
#define INF 100001
using namespace std;
ofstream fout("rmq.out");
int a[INF],n,k,m[350],sqr,nr,j;
void read()
{
    scanf("%d%d",&n,&k);
    for(sqr=1;sqr*sqr<=n;sqr++);
    sqr--; nr=0;
    for(int i=1;i<=sqr;i++)
    {
        scanf("%d",&a[++nr]);
        m[i]=nr;
        for(j=2;j<=sqr;j++)
        {
            scanf("%d",&a[++nr]);
            if(a[nr]<a[m[i]])  m[i]=nr;
        }
    }
    if(sqr*sqr<n)
    {
        scanf("%d",&a[++nr]);
        m[sqr+1]=nr;
        while(nr<n)
        {
            scanf("%d",&a[nr]);
            if(a[nr]>a[m[sqr+1]]) m[sqr+1]=nr;
            nr++;
        }
    }
}
int maxim(int a,int b)
{
    if(a<b) return b;
    else return a;
}
int minim(int inc,int sf)
{
    int vmin=INF;
    if(sf-inc>=sqr)
    {
        int SQinc=inc/sqr+1;
        if(inc%sqr!=0) SQinc++;

        for(int i=inc;i<SQinc*sqr;i++)
            if(a[i]<vmin) vmin=a[i];

        for(int i=SQinc;i*sqr<=sf;i++)
            if(a[m[i]]<vmin) vmin=a[m[i]];

        for(int i=sf/sqr*sqr+1;i<=sf;i++)
            if(a[i]<vmin) vmin=a[i];
    }
    else
        for(int i=inc;i<=sf;i++)
            if(a[i]<vmin) vmin=a[i];
    return vmin;
}
int main()
{
    freopen("rmq.in","r",stdin);
    read();
    int x,y;
    for(int i=1;i<=k;i++)
    {
        scanf("%d%d",&x,&y);
        fout<<minim(x,y)<<'\n';
    }
    return 0;
}