Cod sursa(job #1467477)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 3 august 2015 14:46:14
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <cmath>
int n,m;
int lun[100],a[100001];
int main()
{
    freopen ("rmq.in","r",stdin);
    freopen ("rmq.out","w",stdout);
    scanf("%d%d",&n,&m);
    int s=sqrt(n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    int lungime=n/s;
    if(n%s!=0) lungime++;
    for(int i=1;i<=lungime;i++)
    {
        lun[i]=a[(i-1)*s+1];
        for(int j=1;j<=s;j++)
        {
            if(j+(i-1)*s>n) break;
            if(lun[i]>a[j+(i-1)*s]) lun[i]=a[j+(i-1)*s];
        }
    }
    //for(int i=1;i<=lungime;i++) printf("%d ",lun[i]);
    int i1,i2;
    for(int quer=1;quer<=m;quer++)
    {
        scanf("%d%d",&i1,&i2);
        int rasp=10000000;
        if(i1%s!=1)
        {
            if(i1%s==0)
            {
                if(rasp>a[i1]) rasp=a[i1];
                i1++;
            }
            else
            {
                int targ=i1+(s-(i1%s))+1;
                for(int i=i1;i<targ;i++) if(rasp>a[i]) rasp=a[i];
                i1=targ;
            }
        }
        if(i2%s!=0)
        {
            int targ=i2-(i2%s);
            for(int i=targ+1;i<=i2;i++)
            {
                if(rasp>a[i]) rasp=a[i];
            }
            i2=targ;
        }
        i1/=s;
        i1++;
        i2/=s;
        for(int i=i1;i<=i2;i++) if(rasp>lun[i]) rasp=lun[i];
        printf("%d\n",rasp);
    }
}