Cod sursa(job #1046215)

Utilizator Catalina_BrinzaBrinza Catalina Catalina_Brinza Data 2 decembrie 2013 19:22:20
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
//
//  main.cpp
//  rmq
//
//  Created by Catalina Brinza on 12/2/13.
//  Copyright (c) 2013 Catalina Brinza. All rights reserved.
//

#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");


int main()
{int rmq[100001][20];
    int n,i,x,m,y,l,j;
    f>>n>>m;
    for (i=0;i<n;++i)
    {
        f>>rmq[i][0];
    }
    for (l=1;(1<<l)<n;++l)
        for (i=0;i<n;++i)
        {
            rmq[i][l]=rmq[i][l-1];
            if (i+(1<<(l-1))<n && rmq[i][l]>rmq[i+(1<<(l-1))][l-1])
                rmq[i][l]=rmq[i+(1<<(l-1))][l-1];
        }

    
    for (i=0;i<m;++i)
    {
        f>>x>>y;
        --x;--y;
        bool ok=false;
        if (x>y)
        {
            int aux=x;
            x=y;
            y=aux;
        }
        else if (x==y) {g<<rmq[x][0]<<"\n";ok=true;}
        int l=y-x+1;
        int max=log2(l);

        if (!ok){
        if (rmq[x][max]<rmq[y-(1<<max)+1][max]) g<<rmq[x][max]<<"\n";
            else g<<rmq[y-(1<<max)+1][max]<<"\n";}
    }
    return 0;
}