public static void Main()
int[] t = new []{ 0, 0, 1, 2, 3, 7, 15, 15, 20 };
RangeCalculator calc = new RangeCalculator();
private static void Test(RangeCalculator calc, int rmin, int rmax)
Console.WriteLine("{0} values in range {1}..{2}", calc.countInRange(rmin, rmax), rmin, rmax);
private int [] m_equalOrLess;
public void preprocess(int [] a)
m_equalOrLess = new int[K];
for(int n = 1; n < m_equalOrLess.Length; n++)
m_equalOrLess[n] += m_equalOrLess[n-1];
public int countInRange(int rMin, int rMax)
int nEqualOrLess = m_equalOrLess[Math.Min(rMax, K-1)];
return rMin<=0 ? nEqualOrLess : nEqualOrLess - m_equalOrLess[rMin-1];