Cod sursa(job #2142089)

Utilizator catalinlupCatalin Lupau catalinlup Data 24 februarie 2018 18:42:52
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
#define INFILE "rmq.in"
#define OUTFILE "rmq.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
int N,M;
int K;
const int NMAX=100000;
array<int,NMAX> vec;
array<array<int,NMAX>,NMAX> SparseTable;
void GenerateSparseTable(){
    for(int i=1;i<=N;i++)
        SparseTable[i][0]=vec[i];
    int k=1;
    while(k<=N){
        k=k<<1;
        K++;
    }
    k=k>>1;
    K--;
    for(int j=1;j<=K;j++){
        for(int i=1;i<=N-(1<<j)+1;i++){
            SparseTable[i][j]=min(SparseTable[i][j-1],SparseTable[i+(1<<j)][j-1]);
            cout<<i<<" "<<j<<" "<<SparseTable[i][j]<<"\n";
        }
    }
}
int Querry(int x, int y){
    int L=x;
    int Min=INT_MAX;
    for(int j=K;j>=0;j--){
        if(L+(1<<j)<=y){
            Min=min(SparseTable[L][j],Min);
            L=(1<<j)+1;
        }
    }
    return Min;

}
void Read(){
    in>>N>>M;
    for(int i=1;i<=N;i++)
        in>>vec[i];
    GenerateSparseTable();
}
void Determinare(){
    for(int i=1;i<=M;i++){
        int x,y;
        in>>x>>y;
        out<<Querry(x,y)<<"\n";
    }
}
int main()
{
    Read();
    Determinare();
    return 0;
}