Cod sursa(job #2905901)

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

using namespace std;

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

const int N=1e5;
const int logsize=17;

int n;
int sp[N];
int mat[N][logsize];

void citire()
{
    int x,y;
    fin>>n;
    for (int i=0;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, nr = 0;
    nr = (long long)log2(s);
    return  min(mat[st][nr], mat[dr - (long long)pow(2, nr) + 1][nr]);
}

void solve()
{
     for (int j = 1; j <= logsize; j++)
        for (int i = 0; i + (int)pow(2, j) - 1 < n; i++)
            mat[i][j] = min(mat[i][j - 1], mat[i + (int)pow(2, (j - 1))][j - 1]);
    int q;
    fin>>q;
    for (int i=0;i<q;i++)
    {
        int left,right;
        fin>>left>>right;
        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 + (int)pow(2, j) - 1 <= n; i++)
            mat[i][j] = min(mat[i][j - 1], mat[i + (int)pow(2, (j - 1))][j - 1]);
    while(m--)
    {
        int st,dr;
        fin>>st>>dr;
        fout<<range_min(st,dr)<<'\n';
    }
}

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