Cod sursa(job #2088767)

Utilizator horea4Cenan Horea horea4 Data 15 decembrie 2017 20:24:18
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int N,M;
ifstream fi("rmq.in");
ofstream fo("rmq.out");
int A[100001];
int Table[100001][18];
int k,p;
int main()
{
    fi>>N>>M;
    for (int i=1;i<=N;i++)
        fi>>A[i];
    /// 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]);
    for (int i=1;i<=N;i++)
    {
        for (int j=0;j<=k;j++)
            cout<<setw(3)<<Table[i][j];
        cout<<"\n";
    }
    /// se citesc intrebarile si se da raspunsul
    for (int q=1;q<=M;q++)
    {
        int L,R;
        fi>>L>>R;
        if (L>R)
            swap(L,R);
        int rez;
        rez=1000000;
        for (int i=k;i>=0;i--)
            if (L+(1<<i)-1<=R)
            {
                rez=min(rez,Table[L][i]);
                L=L+(1<<i);
            }
        fo<<rez<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}