Cod sursa(job #2785335)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 18 octombrie 2021 16:19:42
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.78 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define ll long long
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int a[100001],b[100001][18],i,j,n,m,k=INT_MAX,l,t;
int main()
{
in>>n>>m;
for(i=1;i<=n;i++)
    in>>a[i];
for(i=n;i;i--)
{
    k=bmin(k,a[i]),b[i][0]=a[i],j=0;
    while(j<t)b[i][j+1]=bmin(b[i][j],b[i+(1<<j)][j]),j++;
    while(++j<18)b[i][j]=k;
    if((l&(l+1))==0)++t;
    //for(j=0;j<5;j++)cout<<b[i][j]<<' ';cout<<t<<'\n';
    ++l;
}
while(m--)
{
    in>>i>>j,k=INT_MAX,l=++j-i;
    for(t=0;l;t++)
        if(l&(1<<t))
            j-=1<<t,k=bmin(k,b[j][t]),l^=1<<t;
    out<<k<<'\n';
}
}