Cod sursa(job #2392457)

Utilizator roberttrutaTruta Robert roberttruta Data 30 martie 2019 01:02:40
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>

using namespace std;
int n,Q,x,y,k,p,i,j,Min1,Min2,poz[200005][40],pw[100],lg[100005],v[100005];
int main()
{
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    f>>n>>Q;
    for(i=1;i<=n;i++)
    f>>v[i];

    pw[0]=1;
    for(i=1;i<=30;i++)
    pw[i]=pw[i-1]*2;

    k=0;
    for(i=1;i<=n;i++)
    if(pw[k+1]==i)
    {
        k++;
        lg[i]=k;
    }
    else
        lg[i]=k;

   k=lg[n]+1;
   for(i=1;i<=n;i++)
   poz[i][0]=i;

   for(j=1;j<=k;j++)
   for(i=1;i<=n;i++)
   {
       p=pw[j-1];
       if(v[poz[i][j-1]]<v[poz[i+p][j-1]])
        poz[i][j]=poz[i][j-1];
       else
        poz[i][j]=poz[i+p][j-1];
   }

   for(i=1;i<=Q;i++)
   {
       f>>x>>y;
       k=y-x;
       k=lg[k];
       Min1=v[poz[x][k]];
       p=y-x-pw[k]+1;
       Min2=v[poz[x+p][k]];
       g<<min(Min1,Min2)<<'\n';
   }


    return 0;
}