Cod sursa(job #2413044)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 22 aprilie 2019 20:19:49
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <cctype>

using namespace std;

const int SIZE=(1<<17);
int pointer=SIZE;
char buffer[SIZE];

char Advance()
{
        if(pointer==SIZE)
        {
                fread(buffer,1,SIZE,stdin);
                pointer=0;
        }
        return buffer[pointer++];
}

int Read()
{
        int Ans=0;
        char ch=Advance();
        while(!isdigit(ch))
                ch=Advance();
        while(isdigit(ch))
        {
                Ans=10*Ans+(ch-'0');
                ch=Advance;
        }
        return Ans;
}

const int N = 100000 + 3;
const int LG = 17;

int n, Q;
int Rmq[N][LG];
int Log[N];

int main()
{
        freopen("rmq.in", "r", stdin);
        freopen("rmq.out", "w", stdout);
        cin >> n >> Q;
        for(int i = 1; i <= n; i++)
                cin >> Rmq[i][0];
        for(int i = 2; i <= n; i++)
                Log[i] = 1 + Log[i / 2];
        for(int k = 1; (1 << k) <= n; k++)
                for(int i = 1; i + (1 << k) - 1 <= n; i++)
                        Rmq[i][k] = min(Rmq[i][k - 1], Rmq[i + (1 << (k - 1))][k - 1]);
        for(int i = 1; i <= Q; i++)
        {
                int tl, tr;
                cin >> tl >> tr;
                int k = Log[tr - tl + 1];
                int __min = min(Rmq[tl][k], Rmq[tr - (1 << k) + 1][k]);
                cout << __min << "\n";
        }
}