Cod sursa(job #688589)

Utilizator EstarDaian Dragos Estar Data 23 februarie 2012 18:03:17
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>

using namespace std;

ifstream fi("rmq.in");
ofstream fo("rmq.out");

int sir[100000], x , y, e,Min;

int MIN(int a , int b){
    if(!b)return a;
    if(a<b)return a;
    return b;
}

void rmq1(int i , int j , int pos) {
    sir[pos]=MIN(e,sir[pos]);
    if(i==j)return;
    if(x>(i+j)/2)
        rmq1((i+j)/2+1,j,pos*2+1);
    else if(x<=(i+j)/2)
        rmq1(i,(i+j)/2,pos*2);
}

void rmq2(int i , int j , int pos) {
    if(x<=i&&y>=j)
    Min=MIN(sir[pos],Min);
    if(i==j)
    return;
    if(x<=(i+j)/2)
        rmq2(i,(i+j)/2,pos*2);
    if(y>(i+j)/2)
        rmq2((i+j)/2+1,j,pos*2+1);
}

int main() {
    int n , m ;
    fi>>n>>m;
    for(int i=1; i<=n; i++) {
        fi>>e;
        x=i;
        rmq1(1,n,1);
    }
    for(int i=1; i<=m; i++) {
        fi>>x>>y;
        Min=0;
        rmq2(1,n,1);
        fo<<Min<<'\n';
    }
}