Cod sursa(job #1784768)

Utilizator crazylamaRiclea Andrei crazylama Data 20 octombrie 2016 14:54:17
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define min(a,b) ((a) < (b) ? (a) : (b))
using namespace std;

FILE *f = fopen("rmq.in", "r");
FILE *g = fopen("rmq.out", "w");

int n, l, m, *v, *B;

void UpdateMin(int b)
{
    int minim = v[b * l];
    if(b < l)
    {
        for (int i = b * l + 1; i < (b + 1) * l; ++i)
            minim = min(minim, v[i]);
    }
    else if (b == l && n > l * l)
    {
        for (int i = b * l; i < n; ++i)
            minim = min(minim, v[i]);
    }
    B[b] = minim;
}

int main()
{
    fscanf(f, "%d %d", &n, &m);
    v = (int*)calloc(n + 1, sizeof(int));
    l = sqrt((double)n);
    B = (int*)calloc(l + 1, sizeof(int));
    for (int i = 0; i < n; ++i)
        fscanf(f, "%d", &v[i]);
    for (int i = 0; i <= l; ++i)
        UpdateMin(i);
    for (int i = 0; i < m; ++i)
    {
        int x, y, minim;
        fscanf(f, "%d %d", &x, &y);
        x--;
        y--;
        minim = v[x];
        while (x <= y)
        {
            while (x <= y && x % l != 0)
            {
                minim = min(v[x], minim);
                x++;
            }
            if ((y + 1) >= l * x)
            {
                minim = min(B[x / l], minim);
                x += l;
            }
            else
                while (x <= y)
                {
                    minim = min(minim, v[x]);
                    x++;
                }
        }
        fprintf(g, "%d\n", minim);
    }
    return 0;
}