Cod sursa(job #1805844)

Utilizator cosminmaneaCosmin Manea cosminmanea Data 14 noiembrie 2016 15:13:23
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>

#define min(a,b) (a<b?a:b)

using namespace std;

int heap[100100],n,m;

void update(int ind,int li,int lf,int &i,int &x)
{
    if (li==lf) heap[ind]=x;
    else
    {
        int m=(li+lf)/2;
        if (i<=m) update(ind*2,li,m,i,x);
        else update(ind*2+1,m+1,lf,i,x);
        heap[ind]=min(heap[ind*2],heap[ind*2+1]);
    }

}

void get_min(int ind,int li,int lf,int a,int b,int &minim)
{
    if (a<=li&&lf<=b) minim=min(minim,heap[ind]);
    else
    {
        int m=(lf+li)/2;
        if (a<=m) get_min(2*ind,li,m,a,b,minim);
        if (b>=m+1) get_min(2*ind+1,m+1,lf,a,b,minim);
    }
}

int main()
{
    FILE *f=fopen("rmq.in","r");
    FILE *g=fopen("rmq.out","w");
    int i,x;
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&x);
        update(1,1,n,i,x);
    }
    int a,b,minim;
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&a,&b);
        minim=2001000;
        get_min(1,1,n,a,b,minim);
        fprintf(g,"%d\n",minim);
        }
    return 0;
}