Cod sursa(job #1081122)

Utilizator DDeidaraSzasz Tamas Csaba DDeidara Data 13 ianuarie 2014 10:35:50
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>

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

long x[100000];
long a[2000001];
long n,m;

void init(int node,int i,int j)
{
    if (i==j)
        a[node] = x[i];
    else
    {
        init(node*2,i,(i+j)/2);
        init(node*2+1,(i+j)/2+1,j);
        a[node] = min(a[node*2],a[node*2+1]);
    }
}

long query(int node,int x,int y,int i,int j)
{
    if (x > j || y < i)
        return -1;
    else if (i >= x && j <= y)
        return a[node];
    else
    {
        long p1 = query(node*2,x,y,i,(i+j)/2);
        long p2 = query(node*2+1,x,y,(i+j)/2+1,j);

        if (p1 == -1)
            return p2;
        else if (p2 == -1)
            return p1;
        else return min(p1,p2);
    }
}

int main()
{
    FILE*f;
    FILE*g;

    f = fopen("rmq.in","r");
    fscanf(f,"%ld %ld",&n,&m);
    for (int i = 0; i!=n; ++i)
        fscanf(f,"%ld",&x[i]);
    init(1,0,n-1);

    g = fopen("rmq.out","w");

    long x,y;
    for (int i = 0; i !=m; ++i)
    {
        fscanf(f,"%ld %ld",&x,&y);
        fprintf(g,"%ld \n",query(1,x-1,y-1,0,n-1));
    }

    fclose(g);
    fclose(f);

    return 0;
}