Cod sursa(job #2181481)

Utilizator Vlad98Popa Vlad-Gabriel Vlad98 Data 21 martie 2018 18:15:07
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using namespace std;


int main()
{   int N, Q, i, j;
     FILE* fi,fo;
     fi = fopen("rmq.in", "r");
    fscanf(fi,"%d", &N);
    fscanf(fi,"%d", &Q);
    int lg = log2(N);
    int** d=(int**)malloc((lg+1)*sizeof(int*));
    for(i = 0; i < lg+1; i++)
    {
        d[i] =(int*)malloc((N+1)*sizeof(int));
    }

    for(j = 1; j <= N; j++)
    {
        fscanf(fi,"%d", &d[0][j]);
    }
    int x = 1;

    for( i = 1; i <= lg; i++ )
    {

        for(j = 1; j < 2*x; j++)
        {
            d[i][j] = d[i-1][j];
        }
        for(; j <= N; j++)
        {
            d[i][j] = min(d[i-1][j], d[i-1][j - x]);
        }
        x*=2;

    }
    int* putere =(int *)malloc((N+2)*sizeof(int));
    putere[1] = 0;
    putere[0] = 0;
    for( i = 2; i <= N; i++)
    {
      putere[i] = putere[i/2] + 1;
    }
    fo = fopen("rmq.out", "w");
    for(i = 0; i < Q; i++)
    {
        int l , r;
        fscanf(fi,"%d %d", &l, &r);
        int len = r - l + 1;
        int p  = putere[len-1];
        int valPutere = (1<<p);
        fprintf(fo,"%d", min(d[p][r], d[p][l + valPutere - 1]));


    }
    free(putere);
    for(i  = 0; i < lg+1; i++)
        free(d[i]);
    free(d);
    fclose(fi);
    fclose(fo);

    return 0;
}