Cod sursa(job #3124214)

Utilizator zzzzzZazaazaza zzzzz Data 27 aprilie 2023 11:32:03
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <cmath>

int n, b, bk, m, v[100005], x, y, sumr[100005] = {100001};

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &v[i]);
        sumr[i] = 100001;
    }
    b = sqrtl(n);
    bk = (n & 1) ? (n + 1) / b : n / b;
    for(int i = 1; i <= n; ++i) {
        const int ind = (i - 1) / b;
        if(sumr[ind] > v[i]) sumr[ind] = v[i];
    }

    for(int i = 1; i <= m; ++i) {
        scanf("%d %d", &x, &y);
        int mn = 100001;
        const int off1 = (x - 1) % b;
        const int off2 = (y - 1) % b;
        if(off1 == 0 && off2 == b - 1) {
            const int ind1 = (x - 1) / b;
            const int ind2 = (y - 1) / b;
            for(int k = ind1; k <= ind2; ++k) if(mn > sumr[k]) mn = sumr[k];
        } else {
            const int ind1 = (x - 1) / b;
            const int ind2 = (y - 1) / b;
            if(off1 == 0) {
                for(int k = ind1; k <= ind2; ++k) if(mn > sumr[k]) mn = sumr[k];
                for(int k = 0; k < off2; ++k) {
                    const int kk = (ind2 * b) + k + 1;
                    if(mn > v[kk]) mn = v[kk];
                }
            } else if(off2 == b - 1) {
                for(int k = ind1 + 1; k <= ind2; ++k) if(mn > sumr[k]) mn = sumr[k];
                for(int k = off1; k < b; ++k) {
                    const int kk = (ind1 * b) + k + 1;
                    if(mn > v[kk]) mn = v[kk];
                }
            }
        }
        printf("%d\n", mn);
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}