/* * Intervalli.java - questo programma risolve il problema 4.9 p. 116 * di Demetrescu, Finocchi, Italiano, "Algoritmi e strutture dati" * (seconda edizione), McGraw-Hill, 2008. * * Descrivere un algoritmo che dato un array A di n numeri interi, * tutti compresi nell'intervallo [1,k], preprocessa l'array in tempo * O(n+k) in modo da generare una opportuna struttura dati che * consenta di rispondere in tempo O(1) a query del tipo: ``quanti * elementi di $A$ sono compresi nell'intervallo [a,b]?'' (per * qualsiasi $1 \leq a \leq b \leq k$) * * Version 0.1 del 2009/11/09 * Autore: Moreno Marzolla (marzolla (at) cs.unibo.it) * * This file has been released by the author in the Public Domain */ public class Intervalli { int sum[]; // sum[i] e' il numero di elementi di A che sono minori // o uguali di i, i=1,2,...k. sum[0] vale zero int k; /** * Preprocessa l'array A[] (che puo' contenere esclusivamente * valori interi compresi nell'intervallo [1,...k]) in modo da * poter poi rispondere in tempo O(1). * * Questo metodo ha complessit' Theta(n+k), essendo n il numero di * elementi in A[]. */ public Intervalli( int A[], int k ) { this.k = k; int i; sum = new int[k+1]; // Initializza sum[] a zero for ( i=0; i