Cod sursa(job #2503468)

Utilizator BlkAlexAlex Negru BlkAlex Data 3 decembrie 2019 10:40:54
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <bits/stdc++.h>
#define MAX 100010

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n, m;
int v[MAX];
int rmq[20][MAX];
int lg[MAX];

void dostuff(){
    f>>n>>m;
    for (int i = 1; i <= n; i++){
        f >> v[i];
    }

    lg[2] = 1;
    for (int i = 3; i<=n; i++){
        lg[i] = lg[i/2]+1;
    }
}

void domorestuff(){
    for (int i = 1; i <= n; i++){
        rmq[0][i]=v[i];
    }
    for (int i = 1, j, p = 2; p <= n; i++, p *= 2){
        for (j = 1; j+p-1 <= n; j++){
            rmq[i][j]=min(rmq[i-1][j], rmq[i-1][j+p/2]);
        }
    }
}

void doevenmorestuff(){
    int x, y, p;
    while (m--){
        f >> x >> y;
        p = lg[y-x+1];
        g << min(rmq[p][x], rmq[p][y-(1<<p)+1]) << "\n";
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    dostuff();
    domorestuff();
    doevenmorestuff();
    return 0;
}