Cod sursa(job #2089927)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 17 decembrie 2017 12:55:10
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>
#include <algorithm>
#include <iomanip>
using namespace std;
int N,M;
FILE *fi, *fo;
int A[100001];
int Table[100001][18],lg[100001];
int k,p;
int main()
{
    fi=fopen("rmq.in","r");
    fo=fopen("rmq.out","w");
    fscanf(fi,"%d%d",&N,&M);
    for (int i=1;i<=N;i++)
        fscanf(fi,"%d",&A[i]);
    lg[1]=0;
    for(int i=2; i<=N; i++)
        lg[i]=lg[i/2]+1;
    /// se construieste sparse table
    for (int i=1;i<=N;i++)
        Table[i][0]=A[i];
    p=1;
    k=0;
    while ((p<<1)<=N)
    {
        p=p<<1;
        k++;
    }
    for (int j=1;j<=k;j++)
        for (int i=1;i<=N-(1<<j)+1;i++)
            Table[i][j]=min(Table[i][j-1],Table[i+(1<<(j-1))][j-1]);
    /// se citesc intrebarile si se da raspunsul
    for (int q=1;q<=M;q++)
    {
        int L,R;
        fscanf(fi,"%d%d",&L,&R);
        if (L>R)
            swap(L,R);
        int rez;
        rez=min(Table[L][lg[R-L+1]],Table[R-(1<<lg[R-L+1])+1][lg[R-L+1]]);
        fprintf(fo,"%d\n",rez);
    }
    fclose(fi);
    fclose(fo);
    return 0;
}