mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 17:20:10 +01:00
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36184>
65 lines
1.5 KiB
C
65 lines
1.5 KiB
C
/*
|
|
* Copyright 2025 Valve Corporation
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#ifndef RANGE_MINIMUM_QUERY_H
|
|
#define RANGE_MINIMUM_QUERY_H
|
|
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* Find the smallest integer in a portion of an array.
|
|
*
|
|
* We use the simple RMQ algorithm that uses O(n log n) preprcessing time and
|
|
* O(1) query time (see eg. Bender and Colton section 3).
|
|
*
|
|
* Bender, M.A., Farach-Colton, M. (2000). The LCA Problem Revisited. In:
|
|
* Gonnet, G.H., Viola, A. (eds) LATIN 2000: Theoretical Informatics. LATIN
|
|
* 2000. Lecture Notes in Computer Science, vol 1776. Springer, Berlin,
|
|
* Heidelberg. https://doi.org/10.1007/10719839_9
|
|
*/
|
|
|
|
struct range_minimum_query_table {
|
|
uint32_t *table;
|
|
uint32_t width, height;
|
|
};
|
|
|
|
static inline void
|
|
range_minimum_query_table_init(struct range_minimum_query_table *table)
|
|
{
|
|
memset((void*) table, 0, sizeof(*table));
|
|
}
|
|
|
|
void
|
|
range_minimum_query_table_resize(struct range_minimum_query_table *table,
|
|
void *mem_ctx, uint32_t width);
|
|
|
|
/**
|
|
* Perform preprocessing on the table to ready it for queries.
|
|
*
|
|
* Takes O(n log n) time.
|
|
*/
|
|
void
|
|
range_minimum_query_table_preprocess(struct range_minimum_query_table *table);
|
|
|
|
/**
|
|
* Find the smallest value in the array among indices in the half-open interval
|
|
* [left_idx, right_idx).
|
|
*
|
|
* Takes O(1) time.
|
|
*/
|
|
uint32_t
|
|
range_minimum_query(struct range_minimum_query_table *const table,
|
|
uint32_t left_idx, uint32_t right_idx);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|