Cod sursa(job #1920219)

Utilizator duesakBourceanu Cristian duesak Data 9 martie 2017 23:01:13
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
#include<cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int inf=1<<30;
int v[1700000];
void insertarb(int pz,int val, int lf, int rh,int n){
    if(lf==rh){v[n]=val;return;}
    int mij=(lf+rh)/2;
    if(pz<=mij)insertarb(pz,val,lf,mij,n<<1);
    else insertarb(pz,val,mij+1,rh,(n<<1)+1);
    v[n]=min(v[n<<1],v[(n<<1)+1]);
};
int querry(int a,int b, int lf, int rh, int n){
    if(a<=lf&&b>=rh)return v[n];
    int mij=(lf+rh)/2;
    int nd=inf,ns=inf;
    if(a<=mij)ns=querry(a,b,lf,mij,n<<1);
    if(b>=mij+1)nd=querry(a,b,mij+1,rh,(n<<1)+1);
    return min(nd,ns);
}
int main(){
    int n,m,i,x,p,a,b;
    fin>>n>>m;
    p=n*(log(n)+1);
    for(i=1;i<=p;i++)
        v[i]=inf;
    for(i=1;i<=n;i++){
        fin>>x;
        insertarb(i,x,1,n,1);
    }
    for(i=1;i<=m;i++){
        fin>>a>>b;
        fout<<querry(a,b,1,n,1)<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}