Cod sursa(job #1648142)

Utilizator duesakBourceanu Cristian duesak Data 11 martie 2016 02:54:10
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int ma[100100][18];
int v[400100],n,m,minim,log[100005];
void introd(int nod,int st, int dr, int poz, int val){
    if(st==poz&&dr==poz){
        v[nod]=val;
        return;
    }
    int div=(st+dr)/2;
    if(poz<=div)introd(2*nod,st,div,poz,val);
    else introd(2*nod+1,div+1,dr,poz,val);
    v[nod]=min(v[2*nod],v[2*nod+1]);
}
void query(int nod, int st, int dr, int a, int b){
    if(a<=st&&dr<=b){
        if(minim>v[nod])minim=v[nod];
        return;
    }
    int div=(st+dr)/2;
    if(a<=div)query(2*nod,st,div,a,b);
    if(div<b)query(2*nod+1,div+1,dr,a,b);
}
int main(){
    fin>>n>>m;
    int a,b;
    for(int i=1;i<=n;i++){
        fin>>v[i];
        ma[i][0]=i;
        //introd(1,1,n,i,a);
    }
    log[1]=0;
    for(int i=2;i<=n;i++)
        log[i]=log[i/2]+1;
    for(int j=1;(1<<j)<=n;j++)
    for(int i=1;i<=n,i+(1<<j)-1<=n;i++){
        if(v[ma[i][j-1]]<=v[ma[i+(1<<(j-1))][j-1]])
            ma[i][j]=ma[i][j-1];
        else ma[i][j]=ma[i+(1<<(j-1))][j-1];
    }
    int j1,i2,j2;
    for(int i=1;i<=m;i++){
        fin>>a>>b;
        j1=log[b-a+1];
        i2=a+(1<<j1);
        j2=log[b-i2+1];
        //minim=1100001;
        //query(1,1,n,a,b);
        fout<<min(v[ma[a][j1]],v[ma[i2][j2]])<<'\n';
    }
    return 0;
}