Cod sursa(job #2676502)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 24 noiembrie 2020 15:10:49
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define NMAX 100002
#define INF 0x3f3f3f3F

int main() {
    long int num[NMAX];
    long int sq[NMAX] = {0};
    int N, M; 
    long int r;

    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);

    scanf("%d %d", &N, &M);

    for (int i = 1 ; i <= N ; i++) {
        scanf("%ld", &num[i]);
    }

    r = 0;

    while (r * r <= N)
    {
        r++;
    }
    r--;
    
    for (int i = 1 ; r * i <= N ; i++) {
            sq[i] = INF;
            for(long int j = r * (i - 1) + 1 ; j <= r * i ; j++) {
                sq[i] = min(sq[i], num[j]);
            }
    }

    long int j, x, y, ls, ld, rez;
    for (int i = 1 ; i <= M ; i++) {
        rez = INF;

        scanf("%ld %ld", &x, &y);
        
        j = 1;
        while (r * j < x)
        {
            j++;
        }
        j++;

        ls = min(r * (j - 1), y);

        while (r * j <= y) {
            rez = min(rez, sq[j]);
            j++;
        }

        ld = max(r * (j - 1), x);


        for (j = x ; j <= ls ; j++) {
	        rez = min(rez, num[j]);
        }
	
		for (j = ld ; j <= y ; j++) {
			rez = min(rez, num[j]);
        }

        printf("%ld\n", rez);
    }

    return 0;
}