Cod sursa(job #1467495)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 3 august 2015 15:07:56
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 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]);
    //printf("\n");
    int i1,i2;
    for(int quer=1;quer<=m;quer++)
    {
        scanf("%d%d",&i1,&i2);
        int i1t=i1,i2t=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;
            }
        //printf("%d %d\n",i1,i2);
         //   printf("%d %d\n",i1,i2);
            if(i1<=i2)
            {
                i1/=s;
                i1++;
                i2/=s;
                for(int i=i1;i<=i2;i++) if(rasp>lun[i]) rasp=lun[i];
            }
            else
            {
                rasp=10000000;
                for(int i=i1t;i<=i2t;i++) if(rasp>a[i]) rasp=a[i];
            }
        printf("%d\n",rasp);
    }
}