Cod sursa(job #1246552)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 21 octombrie 2014 11:45:11
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
/*#include <stdio.h>
FILE *fin, *fout;
long n, m, x, y, s;
bool r;
long power[21] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576};
long int min(int a, int b)
{
    return (a > b)?b:a;
}
long int log(int a)
{
    for(long int i =0;;i++)
    {
            if(power[i]> a) return i-1;
    }
}
int main()
{
    fin = fopen("rmq.in", "r");
    fout = fopen("rmq.out", "w");
    fscanf(fin, "%ld %ld", &n, &m);
    long int arr[log(n)][n];
    s = n;
    for(long int i =0; i<= log(n);r = 1, s-=power[i], i++)
    {
            for(long int j = 0; j< s; j++)
            {
                    if(r == 0)
                    {
                         fscanf(fin, "%ld", &arr[i][j]);
                    }
                    else arr[i][j] = min(arr[i-1][j], arr[i-1][j+power[i-1]]);
            }
    }
    for(long int i =0; i< m; i++)
    {
            fscanf(fin, "%ld%ld", &x, &y);
            fprintf(fout, "%ld\n", min(arr[log(y-x)][x-1], arr[log(y-x)][y - power[log(y-x)]]));
    }
    return 0;
}*/
#include <stdio.h>
FILE *fin, *fout;
int n, m, x, y, s;
bool r;
int power(int a, int b)
{
    if(b == 0) return 1;
    if(b == 1) return a;
    int temp = power(a, b/2);
    return temp*temp*power(a, b%2);
}
int min(int a, int b)
{
    return (a > b)?b:a;
}
int log(int a)
{
    for(int i =0;;i++)
    {
            if(power(2, i) > a) return i-1;
    }
}
int main()
{
    fin = fopen("rmq.in", "r");
    fout = fopen("rmq.out", "w");
    fscanf(fin, "%d %d", &n, &m);
    int arr[log(n)][n];
    s = n;
    for(int i =0; i<= log(n);r = 1, s-=power(2, i), i++)
    {
            for(int j = 0; j< s; j++)
            {
                    if(r == 0)
                    {
                         fscanf(fin, "%d", &arr[i][j]);
                    }
                    else arr[i][j] = min(arr[i-1][j], arr[i-1][j+power(2, i-1)]);
            }
    }
    for(int i =0; i< m; i++)
    {
            fscanf(fin, "%d%d", &x, &y);
            fprintf(fout, "%d\n", min(arr[log(y-x)][x-1], arr[log(y-x)][y - power(2, log(y-x))]));
    }
     
    return 0;
}