Cod sursa(job #207153)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 11 septembrie 2008 22:42:38
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>

FILE *fin=fopen("rmq.in","r"),
    *fout=fopen("rmq.out","w");

int a[100005],M[400005],N,K;


void completare(int nod,int b,int e){

    if(b==e)
        M[nod]=e;
    else{

        completare(2*nod,b,(b+e)/2);
        completare(2*nod+1,(b+e)/2+1,e);

        if(a[M[2*nod]]<=a[M[2*nod+1]])
            M[nod]=M[2*nod];
        else
            M[nod]=M[2*nod+1];
    }
}

int rezolvare(int nod,int b,int e,int i,int j){

    int p1,p2;

    if(i>e || j<b)
        return -1;
    if(i<=b && j>=e)
        return M[nod];

    p1=rezolvare(2*nod,b,(b+e)/2,i,j);
    p2=rezolvare(2*nod+1,(b+e)/2+1,e,i,j);

    if(p2==-1)
        return p1;
    if(p1==-1)
        return p2;
    if(a[p1]<=a[p2])
        return p1;
    return p2;
}

int main(){

    fscanf(fin,"%d %d",&N,&K);
    for(int i=1;i<=N;i++)
        fscanf(fin,"%d",&a[i]);

    completare(1,1,N);
/*
    for(int i=1;i<=9;i++)
        fprintf(fout,"%d ",a[M[i]]);
*/
    for(int k=1;k<=K;k++){
        int i,j;
        fscanf(fin,"%d %d",&i,&j);

        fprintf(fout,"%d\n",a[rezolvare(1,1,N,i,j)]);
    }

    fclose(fin);
    fclose(fout);
    return 0;
}