Cod sursa(job #1637918)

Utilizator adu18sptAndrei Mircea adu18spt Data 7 martie 2016 19:57:58
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
#include<cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int MaxN = 100111;
const int SqrtMaxN = 350;
#define INF 0x3f3f3f3f
int N, M;

int v[MaxN];
int SN;
int fasie[MaxN/SqrtMaxN];

int query(int l, int r)
{
    int minim =INF;
    int pozs;
    for(int i=1;i<=N/SN;++i)
    {
        if(i*SN>=l && (i+1)*SN-1<=r)
        {
            if(minim>fasie[i])
            {
                minim =fasie[i];
            }
            pozs=(i*1)*SN-2;
        }
    }
    if(l%SN != 0)
    {
        for(;l<=r && l%SN!=0;++l)
        {
            if(minim > v[l])
            {
                minim = v[l];
            }
        }
    }
    if(r%SN !=0 )
    {
        for(;pozs<=r;pozs++)
        {
            if(minim>v[pozs])
            minim =v[pozs];
        }
    }
    return minim;
    
}
int main()
{
    fin>>N>>M;
    SN=sqrt(N);
    for(int i=1;i<=N;i++)
    fin>>v[i];
    
    
    for(int i=1;i<=N/SN;++i)
    {
        fasie[i] = INF;
    }
    
    for(int i=1;i<=N;++i)
    {
            int indice_fasie = i/SN;
            if (fasie[indice_fasie] > v[i])
           {
               fasie[indice_fasie] = v[i];
           }
    }
    
    for(int i=1;i<=M;++i)
    {
        int l, r;
        fin>>l>>r;
        fout<<query(l, r)<<"\n";
    }
}