Cod sursa(job #1528130)

Utilizator kassay_akosKassay Akos kassay_akos Data 19 noiembrie 2015 08:40:56
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>

using namespace std;
const int nmax = 100002 ;
const int lmax = 18 ; // log2 100000 = 16.6
const int inf = 1 << 30 ;

int n;
int v[lmax][nmax], lg[nmax];
int main()
{
    int m;
    freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d %d", &n, &m);
	for (int i = 0; i<n ; i++) {
        scanf("%d", &v[0][i]);
	}

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

    for(int i = 1; (1 << i) < n ; i++) {
        for (int j = 0; j <= m - (1 << i)+1 ; j++)
            v[i][j] = min(v[i-1][j],v[i-1][j+(1 << (i-1))]);
    }

    long x,y,l;
    for (;m;m--) {
        scanf("%ld %ld",&x , &y);
        int diff = y-x+1;
        l = lg[diff];
        int raad = diff - (1 << l) - 1;
        printf("%d \n",min(v[l][x-1],v[l][x+ raad]));

    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}