Cod sursa(job #2787044)

Utilizator roberttrutaTruta Robert roberttruta Data 22 octombrie 2021 12:37:23
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#define inf 9999999
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int* const_vct_minim(int n,int radical,int* v)
{
    int i,j,Min;
    int* vct_min=(int*)malloc(sizeof(int)*(radical+5));
    for(i=0;i*radical<n;i++)
    {
        Min=inf;
        for(j=i*radical;j<(i+1)*radical&&j<n;j++)
            if(v[j]<Min)
                Min=v[j];
        vct_min[i]=Min;
    }
    return vct_min;
}

int raspunde(int radical,int* v,int* vct_min,int stanga, int dreapta)
{
    int i,Min=inf;
    int poz_stanga=stanga/radical+1;
    int poz_dreapta=dreapta/radical;
    for(i=stanga;i<poz_stanga*radical&&i<=dreapta;i++)
        if(v[i]<Min)
            Min=v[i];
    for(i=dreapta;i>=poz_dreapta*radical&&i>=stanga;i--)
        if(v[i]<Min)
            Min=v[i];
    for(i=poz_stanga;i<poz_dreapta;i++)
        if(vct_min[i]<Min)
            Min=vct_min[i];
    return Min;
}

int main()
{
    int i,nr_operatii,n,radical=0,t,a,b;

    f>>n>>nr_operatii;
    int* v=(int*)malloc(sizeof(int)*(n+5));

    for(i=0;i<n;i++)
        f>>v[i];
    while(radical*radical<n)
        radical++;

    int* vct_min=const_vct_minim(n,radical,v);

    for(i=0;i<nr_operatii;i++)
    {
        f>>a>>b;
        g<<raspunde(radical,v,vct_min,a-1,b-1)<<'\n';
    }

    free(v);
    free(vct_min);

    return 0;
}