Cod sursa(job #2378048)

Utilizator RazvanPanaiteRazvan Panaite RazvanPanaite Data 11 martie 2019 16:37:27
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include <bits/stdc++.h>
#define DMAX 100010
#define LogDMAX 20

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int V[DMAX];
int M[DMAX][LogDMAX];

int n,m;

void citire();
void constr();

int main()
{int i,j,k;
 citire();
 constr();
 while(m--)
     {fin>>i>>j;
      k=log2(j-i+1);
      if(V[M[i][k]] < V[M[j-(1<<k)+1][k]])
         fout<<V[M[i][k]]<<'\n';
         else
         fout<<V[M[j-(1<<k)+1][k]]<<'\n';
     }
 return 0;
}
void citire()
{int i;
 fin>>n>>m;
 for(i=1;i<=n;i++)
     fin>>V[i];
}
void constr()
{int i,j;
 for(i=1;i<=n;i++)
     M[i][0]=i;
 for(j=1; (1<<j)<=n; j++)
     for(i=1;i+(1<<j)-1<=n;i++)
         if(V[M[i][j-1]]<V[M[i+(1<<(j-1))][j-1]])
            M[i][j]=M[i][j-1];
            else
            M[i][j]=M[i+(1<<(j-1))][j-1];
}