Cod sursa(job #1698848)

Utilizator Timur17Ibram Timur Timur17 Data 5 mai 2016 15:34:49
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<cstdio>
#include<cmath>
using namespace std;
#define DIM 10000
char buff[DIM];
int poz=0;

void citeste(int &numar)
{
     numar = 0;
     //cat timp caracterul din buffer nu e cifra ignor
     while (buff[poz] < '0' || buff[poz] > '9')
          //daca am "golit" bufferul atunci il umplu
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     //cat timp dau de o cifra recalculez numarul
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     }
}
int n,v[100023],bucata[100023];
int min(int a,int b)
{
    if(a<b) return a;
    return b;
}
int main()
{
    freopen ("rmq.in","r",stdin);
    freopen ("rmq.out","w",stdout);
    int m;
    citeste(n),citeste(m);
    for(int i=1;i<=n;i++) bucata[i]=1000000000;
    for(int i=1;i<=n;i++) citeste(v[i]);
    int buc=1,mar=sqrt(n);
    for(int i=1;i<=n;i++)
    {
        if((i-1)%mar==0&&i!=1) ++buc;
        bucata[buc]=min(bucata[buc],v[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int a,b,sum=1000000000;
        citeste(a),citeste(b);
        for(int j=a;j<=b;j++)
        {
            if((j-1)%mar==0&&j+mar<=b&&j!=1)
            {
                sum=min(sum,bucata[(j-1)/mar +1]);
                j+=mar-1;
            }
            else sum=min(sum,v[j]);
        }
        printf("\n%d\n",sum);
    }
}