Cod sursa(job #3263288)

Utilizator axetyNistor Iulian axety Data 14 decembrie 2024 10:06:08
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <cmath>
#include <stdlib.h>
#include <algorithm>

using namespace std;

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



/**
 * 
 * RMQ (range minimum query) ; 
 *       |      |       |
 *      i j   numerele  !
 *          pot sa apara
 *       de mai multe ori
 * 
 *    10 elem.
 * 
 *    1 5 8 3 9 14 17 7 20 9 
 *      
 * 
 *  rmq[n][log n] 
 * 
 * i=1,n
 * j=1,logn
 * 1<<j
 * 
 * rmq[i][0]=v[i]
 * rmq[i][j]=min(rmq[i][j-1],rmq[i+2^j])
 * 
 * rmq[i][j]=rez pe interval de la i de lungime 2^j
 * 
 * [x,y] = rmq[x][l]
 *         rmq[y-l+1][l]
 * 
 * p2[i]-> 2^j<=i, 2^j maxim
 * 
 * p2[i-1] sau p2[i-1]*2
 * 
 *  Lowest common ancestor ( LCA ) :
 * 
 *  x , y 
 * 
 *      
 * 
**/
int n,m,x,y,dif,l;
int v[100001];
int rmq[100001][20];
int p2[100001];

void create()
{
    p2[1]=0;
   for(int i=2;i<=n;i++)
   {
    p2[i]=p2[i-1];
    if((1<<(p2[i]+1)) <=i)
        p2[i]++;
   }
   for(int i=1;i<=n;i++)
   {
    rmq[i][0]=v[i];
   } 
   for(int j=1;(1<<j)<=n;j++)
   {
      for(int i=1;i<=n-(1<<j)+1;i++)
      {
        rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
      }
   }
}

int main(){
    fin >> n >> m;
    for(int i=1;i<=n;i++){
        fin >> v[i];
        fin.get();
    }
    create();
    for(int q=1;q<=m;q++)
    {
        fin >> x >> y;
        l=y-x+1;
        fout << min(rmq[x][p2[l]],rmq[y-(1<<p2[l])+1][p2[l]]) << '\n';
    }
    return 0;
}