Cod sursa(job #2087157)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 13 decembrie 2017 06:32:35
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int nm=100000,nm2=2*(131072+100);
int v[nm+5];
int sol[nm2+5];
int n,m;
int p,a,b;
int len;
void build(int st,int dr,int poz)
{
    if(st==dr)
    {
        sol[poz]=v[st];
        return;
    }
    int med=(st+dr)/2;
    build(st,med,2*poz+1);
    build(med+1,dr,2*poz+2);
    sol[poz]=min(sol[2*poz+1],sol[2*poz+2]);
}
int slove(int a,int b,int st,int dr,int poz)
{
    if(a<=st and dr<=b)
        return sol[poz];
    if(dr<a or b<st)
        return 1e9;
    int med=(st+dr)/2;
    return min(slove(a,b,st,med,2*poz+1),slove(a,b,med+1,dr,2*poz+2));
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin>>v[i];
    for(int i=0;i<=nm2;i++)
        sol[i]=-1;
    build(0,n-1,0);
    for(int i=0;i<=nm2;i++)
        if(sol[i]==-1)
        {
            len=i;
            break;
        }
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        cout<<slove(a-1,b-1,0,n-1,0)<<"\n";
    }
    return 0;
}
/**
**/