Cod sursa(job #1804454)

Utilizator cosminmaneaCosmin Manea cosminmanea Data 12 noiembrie 2016 16:36:40
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <vector>

using namespace std;

int heap[100010];

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(2*ind,li,m,i,x);
        else update(2*ind+1,m+1,lf,i,x);
        heap[ind]=heap[2*ind]>heap[2*ind+1]?heap[2*ind]:heap[2*ind+1];
    }
}

int get_min(int ind,int li,int lf,int a,int b)
{
    int mn;
    if(a<=li&&lf<=b)
        return mn=mn>heap[ind]?mn:heap[ind];
    int m=(li+lf)/2,m1;
    if(a<=m)
        mn=get_min(2*ind,li,m,a,b);
    if(b>=m+1)
    {
        m1=get_min(2*ind+1,m+1,lf,a,b);
        if(m1<mn) mn=m1;
    }
    return mn;
}

int main()
{
    FILE *f=fopen("rmq.in","r");
    FILE *g=fopen("rmq.out","w");
    int n,m,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;
    for(i=1;i<=m;++i)
    {
        fscanf(f,"%d%d",&a,&b);
        fprintf(g,"%d\n",get_min(1,1,n,a,b));
    }
    return 0;
}