Cod sursa(job #1463825)

Utilizator jul123Iulia Duta jul123 Data 21 iulie 2015 16:15:07
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<bits/stdc++.h>

using namespace std;

int a[100005], dp[100005][25], lg[100005];
int main()
{
    int n, m, c, b;
    FILE *fin = fopen("rmq.in", "r");
    FILE *fout = fopen("rmq.out", "w");

   fscanf(fin, "%d %d", &n, &m);

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

    for(int i = 0; i < n; ++i)
        fscanf(fin, "%d", &a[i]);

    for(int i = 0; i < n; ++i)
        dp[i][0] = a[i];
    for(int j = 1; j < 20; ++j)
        for(int i = 0; i < n; ++i)
            if(i + (1 << (j - 1)) <= n)
                dp[i][j] = min(dp[i + (1 << (j - 1))][j - 1], dp[i][j - 1]);

    for(int i = 0; i < m; ++i) {
        fscanf(fin, "%d %d", &c, &b);
        --c; --b;
        int x = lg[b - c + 1];
        fprintf(fout, "%d\n", min(dp[c][x], dp[b - (1 << x) + 1][x]));
    }


}