def clip(x, lo, hi):
  return max(lo, min(hi, x))


def interp(x, xp, fp):
  N = len(xp)
  if not hasattr(x, '__iter__'):
    hi = 0
    while hi < N and x > xp[hi]:
      hi += 1
    low = hi - 1
    return fp[-1] if hi == N and x > xp[low] else (
      fp[0] if hi == 0 else
      (x - xp[low]) * (fp[hi] - fp[low]) / (xp[hi] - xp[low]) + fp[low])

  result = []
  for v in x:
    hi = 0
    while hi < N and v > xp[hi]:
      hi += 1
    low = hi - 1
    result.append(fp[-1] if hi == N and v > xp[low] else (fp[
      0] if hi == 0 else (v - xp[low]) * (fp[hi] - fp[low]) / (xp[hi] - xp[low]
                                                               ) + fp[low]))
  return result