Cod sursa(job #2083572)

Utilizator sichetpaulSichet Paul sichetpaul Data 7 decembrie 2017 20:59:38
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>

using namespace std;
int rmq[100001][20],a[100001],log[100001];
int main()
{ int n,m,i,j,mij,st,dr;
    ifstream f("rmq.in");
    ofstream g("rmq.out");
    f>>n>>m;
    for (i=1;i<=n;++i)
        f>>a[i];
    for (i=1;i<=n;++i)
        rmq[i][0]=i;
    for (j=1;1<<j<=n;++j)
    for (i=1;i+(1<<j)-1<=n;++i)
      if (a[rmq[i][j-1]]<a[rmq[i+(1<<(j-1))][j-1]])
           rmq[i][j]=rmq[i][j-1];
      else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];

    /* for (j=0;1<<j<=n;++j) {
    for (i=1;i+(1<<j)-1<=n;++i)
        g<<a[rmq[i][j]]<<" ";
    g<<'\n';}*/
    for (i=2;i<=n;++i)
        log[i]=log[i/2]+1;
      for (i=1;i<=m;++i) {
          f>>st>>dr;
          mij=log[dr-st+1];
          g<<min(a[rmq[st][mij]],a[rmq[dr-(1<<mij)+1][mij]])<<'\n';;
      }
    return 0;
}