Cod sursa(job #2905902)

Utilizator ciobyCiobanu Vlasie cioby Data 24 mai 2022 12:00:14
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

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


const int logsize=17;

int n;
long sp[150002];
long mat[150002][17];

void citire()
{
    int x,y;
    fin>>n;
    for (int i=1;i<=n;i++)
    {
        fin>>x>>mat[i][0];
        sp[i]=sp[i-1]+x;
    }
}

long long range_min(int st,int dr)
{
    long long s=dr-st+1;
    long long nr=0;
    nr=(long long)log2(s);
    return min(mat[st][nr],mat[dr-(1<<nr)+1][nr]);
}

void solve()
{
    for (int j = 1; j <= logsize; j++)
        for (int i = 1; i + (1<<j)-1<= n; i++)
            mat[i][j] = min(mat[i][j - 1], mat[i + (1<<(j-1))][j - 1]);
    int q;
    fin>>q;
    for (int i=1;i<=q;i++)
    {
        int left,right;
        fin>>left>>right;
        fout<<range_min(left,right)*(sp[right]-sp[left-1])<<'\n';
    }
}

void solve_rmq()
{
    int n,m;
    fin>>n>>m;
    for (int i=1;i<=n;i++)
        fin>>mat[i][0];
    for (int j = 1; j <= logsize; j++)
        for (int i = 1; i + (1<<j)-1<= n; i++)
            mat[i][j] = min(mat[i][j - 1], mat[i + (1<<(j-1))][j - 1]);
    while(m--)
    {
        int st,dr;
        fin>>st>>dr;
        fout<<range_min(st,dr)<<'\n';
    }
}

int main()
{
    //citire();
   // solve();
    solve_rmq();
}