Cod sursa(job #2754052)

Utilizator Virgil993Virgil Turcu Virgil993 Data 24 mai 2021 22:28:22
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include<bits/stdc++.h>

using namespace std;

#define n_max 100001

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int v[n_max];
int m[n_max][(int)log2(n_max)],lg[100001];
int n;

long long putere(int x)
{
    long long rez = 1;
    while(x)
    {
        rez = rez*2;
        x--;
    }
    return rez;
}

void procces(int v[n_max],int m[n_max][(int)log2(n_max)],int n)
{
    int i,j;
    for(i = 0;i<n;i++)
        m[i][0] = i;
    for(j=1;putere(j)<=n;j++)
        for(i=0;i+putere(j)-1<n;i++)
            if(v[m[i][j-1]]<=v[m[i+putere(j-1)][j-1]])
                m[i][j] = m[i][j-1];
            else
                m[i][j] = m[i+putere(j-1)][j-1];
}



int main()
{
    int p;
    int log;
    int prim,sec;
    fin>>n>>p;
    for(int i=0;i<n;i++)
        fin>>v[i];
    procces(v,m,n);
    for(int i=0;i<p;i++)
    {
        fin>>prim>>sec;
        prim--;
        sec--;
        log = (int)log2(sec-prim+1);
        if(v[m[prim][log]]<=v[m[sec-putere(log)+1][log]])
            fout<<v[m[prim][log]]<<"\n";
        else
            fout<<v[m[sec-putere(log)+1][log]]<<"\n";
    }



    return 0;
}