import java.util.*;
import java.util.zip.*;
import java.util.List;
import java.util.regex.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.lang.ref.*;
import java.lang.management.*;
import java.security.*;
import java.security.spec.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.math.*;
class main {

static IBWImage posterizeIBWImage(int brightnessLevels, IBWImage img) {
  if (brightnessLevels >= 256 || img == null) return img;
  int w = img.getWidth(), h = img.getHeight();
  
  return new IBWImage() {
    public int getWidth() { return w; }
    public int getHeight() { return h; }
    
    public float getFloatPixel(int x, int y) {
      return (float) quantizeToNLevelsBetweenZeroAndOne_stretch(
        brightnessLevels, img.getFloatPixel(x, y));
    }
  };
}
static double quantizeToNLevelsBetweenZeroAndOne_stretch(int n, double x) {
  x = clampZeroToOne(x);
  return doubleRatio(min(n-1, floor(x*n)), n-1);
}





  static float clampZeroToOne(float x) {
    return x < 0 ? 0 : x > 1 ? 1 : x;
  }


  static double clampZeroToOne(double x) {
    return x < 0 ? 0 : x > 1 ? 1 : x;
  }




static double doubleRatio(double x, double y) {
  return y == 0 ? 0 : x/y;
}




static int min(int a, int b) {
  return Math.min(a, b);
}

static long min(long a, long b) {
  return Math.min(a, b);
}

static float min(float a, float b) { return Math.min(a, b); }
static float min(float a, float b, float c) { return min(min(a, b), c); }

static double min(double a, double b) {
  return Math.min(a, b);
}

static double min(double[] c) {
  double x = Double.MAX_VALUE;
  for (double d : c) x = Math.min(x, d);
  return x;
}

static float min(float[] c) {
  float x = Float.MAX_VALUE;
  for (float d : c) x = Math.min(x, d);
  return x;
}

static byte min(byte[] c) {
  byte x = 127;
  for (byte d : c) if (d < x) x = d;
  return x;
}

static short min(short[] c) {
  short x = 0x7FFF;
  for (short d : c) if (d < x) x = d;
  return x;
}

static int min(int[] c) {
  int x = Integer.MAX_VALUE;
  for (int d : c) if (d < x) x = d;
  return x;
}


static double floor(double d) {
  return Math.floor(d);
}




static interface IBWImage {
  int getWidth();
  int getHeight();
  float getFloatPixel(int x, int y); // usually between 0 and 1
}

}