Cod sursa(job #2120395)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 2 februarie 2018 13:36:53
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int N = 100002, L = 18;
int rmq[L][N], lg[N], put[L], x, y;
void process(int n){
    lg[1] = 0;
    put[0] = 1;
    for(int i=2;i<=n;i++)
        lg[i] = lg[i/2] + 1;
    for(int i=1;i<=L;i++)
        put[i] = put[i-1] * 2;
    for(int i=1;put[i] <= n;i++)
        for(int j=1;j<=n-put[i]+1;j++)
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+put[i-1]]);
}
int query(){
    int len = y - x + 1, log, dist;
    log = lg[len];
    dist = len - put[log];
    return min(rmq[log][x], rmq[log][x+dist]);
}
int main()
{
    int n,m;
    in>>n>>m;
    for(int i=1;i<=n;i++)
        in>>rmq[0][i];
    process(n);
    for(int i=1;i<=m;i++){
        in>>x>>y;
        out<<query()<<"\n";
    }
    in.close();
    out.close();
    return 0;
}