Cod sursa(job #1210451)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 19 iulie 2014 23:39:07
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
using namespace std;
ifstream fi("rmq.in");
ofstream fo("rmq.out");

const int max_n = 100005;

int rmq[max_n][18];
int lg[max_n];
int a[max_n];
int i,n,m;

int min(const int &a, const int &b){ 
    if(a<b) return a;
    else return b;
}

void logaritm_n(int n, int lg[max_n]){
     int i; lg[1]=0;
     for(i=2;i<=n;i++) lg[i]=lg[i/2]+1;
}

void r_m_q(int a[max_n], int n, int rmq[max_n][18]){
     int i,j,lim;
     
     lim=lg[n];
     for(i=1;i<=n;i++) rmq[i][0]=i;
     
     for(j=1; j<=lim; j++)
       for(i=1; i+(1<<j)-1<=n; i++)
         if(a[rmq[i][j-1]]<a[rmq[i+(1<<(j-1))][j-1]]) rmq[i][j]=rmq[i][j-1];
         else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}

int query(int x, int y){
    int lung=y-x+1;
    int z=lg[lung];
    int sol=min(a[rmq[x][z]],a[rmq[y-(1<<z)+1][z]]);
    return sol;
}

void queries(int m){
     int x,y;
     for(;m>0;m--){
                   fi>>x>>y; 
                   fo<<query(x,y)<<"\n";
                  }
}

int main(){
    fi>>n>>m;
    for(i=1;i<=n;i++) fi>>a[i];
    
    logaritm_n(n,lg);
    
    r_m_q(a,n,rmq);
    
    queries(m);
    
    fi.close();
    fo.close();
    return 0;
}