Cod sursa(job #1746421)

Utilizator Mihai_BarbuMihai Barbu Mihai_Barbu Data 23 august 2016 11:41:34
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
/*Se da un vector cu N elemente. Scrieti un program care raspunde la M intrebari de tipul
"Care este elementul minim din intervalul [x,y]?" Infoarena*/
#include <bits/stdc++.h>

using namespace std;
FILE*fin=fopen("rmq.in","r");
ofstream fout("rmq.out");
int n,m,d[20][100002],q;

int putere2(int n)
{
        int p=1;
        while(p<n)
            p<<=1;
        if(p>n)  p>>=1;
        return p;
}

void constructie_matrice()
{
    int i,j,nr=1;
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n-nr;j++)
            d[i][j]=min(d[i-1][j],d[i-1][j+nr]);
        nr<<=1;
    }
   /*& for(i=0;i<=m;i++)
    {
        for(j=1;j<=n&&d[i][j]!=0;j++)
            fout<<d[i][j]<<" ";
        fout<<'\n';
    }*/
}

int putere(int a,int b)
{
    int i=1,p=1;
    for(i=1;i<=b;i++)
    p<<=1;
  return p;
}

int exponent(int x)
{
    int k=0,p=1;
    while(p<x)
    {
        p<<=1;
        k++;
    }
    if(p>x) k--;
    return k;
}

int determina(int x,int y)
{
    int k=exponent(y-x);
    return min(d[k][x],d[k][y-putere(2,k)+1]);
}

int main()
{
    fscanf(fin,"%d%d",&n,&q);
    int i;
    for(i=1;i<=n;i++)
        fscanf(fin,"%d",&d[0][i]);
    m=exponent(n);
    constructie_matrice();
    int x,y;
    for(i=1;i<=q;i++)
    {
        fscanf(fin,"%d%d",&x,&y);
        if(x>y) swap(x,y);
        fout<<determina(x,y)<<'\n';
    }
    return 0;
}