/**
 * 
 */
package hu.herba.codejam;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

/**
 * Base functionality, helper functions for CodeJam problem solver utilities.
 * 
 * @author csorbazoli
 */
public abstract class AbstractCodeJamBase {
    private static final String EXT_OUT = ".out";
    protected static final int STREAM_TYPE = 0;
    protected static final int FILE_TYPE = 1;
    protected static final int READER_TYPE = 2;
    private static final String DEFAULT_INPUT = "test_input";
    private static final String DEFAULT_OUTPUT = "test_output";

    private final File inputFolder;
    private final File outputFolder;

    public AbstractCodeJamBase(String[] args, int type) {
	String inputFolderName = AbstractCodeJamBase.DEFAULT_INPUT;
	String outputFolderName = AbstractCodeJamBase.DEFAULT_OUTPUT;
	if (args.length > 0) {
	    inputFolderName = args[0];
	}
	this.inputFolder = new File(inputFolderName);
	if (!this.inputFolder.exists()) {
	    this.showUsage("Input folder '" + this.inputFolder.getAbsolutePath() + "' not exists!");
	}
	if (args.length > 1) {
	    outputFolderName = args[1];
	}
	this.outputFolder = new File(outputFolderName);
	if (this.outputFolder.exists() && !this.outputFolder.canWrite()) {
	    this.showUsage("Output folder '" + this.outputFolder.getAbsolutePath() + "' not writeable!");
	} else if (!this.outputFolder.exists() && !this.outputFolder.mkdirs()) {
	    this.showUsage("Could not create output folder '" + this.outputFolder.getAbsolutePath() + "'!");
	}
	File[] inputFiles = this.inputFolder.listFiles();
	for (File inputFile : inputFiles) {
	    this.processInputFile(inputFile, type);
	}
    }

    /**
     * @return the inputFolder
     */
    public File getInputFolder() {
	return this.inputFolder;
    }

    /**
     * @return the outputFolder
     */
    public File getOutputFolder() {
	return this.outputFolder;
    }

    /**
     * @param input
     *            input reader
     * @param output
     *            output writer
     * @throws IOException
     *             in case input or output fails
     * @throws IllegalArgumentException
     *             in case the given input is invalid
     */
    @SuppressWarnings("unused")
    protected void process(BufferedReader reader, PrintWriter pw) throws IOException, IllegalArgumentException {
	System.out.println("NEED TO IMPLEMENT (reader/writer)!!!");
	System.exit(-2);
    }

    /**
     * @param input
     *            input file
     * @param output
     *            output file (will be overwritten)
     * @throws IOException
     *             in case input or output fails
     * @throws IllegalArgumentException
     *             in case the given input is invalid
     */
    protected void process(File input, File output) throws IOException, IllegalArgumentException {
	System.out.println("NEED TO IMPLEMENT (file/file)!!!");
	System.exit(-2);
    }

    /**
     * @param input
     *            input stream
     * @param output
     *            output stream
     * @throws IOException
     *             in case input or output fails
     * @throws IllegalArgumentException
     *             in case the given input is invalid
     */
    protected void process(InputStream input, OutputStream output) throws IOException, IllegalArgumentException {
	System.out.println("NEED TO IMPLEMENT (stream/stream)!!!");
	System.exit(-2);
    }

    /**
     * @param type
     * @param input
     * @param output
     */
    private void processInputFile(File input, int type) {
	long starttime = System.currentTimeMillis();
	System.out.println("Processing '" + input.getAbsolutePath() + "'...");
	File output = new File(this.outputFolder, input.getName() + AbstractCodeJamBase.EXT_OUT);
	if (type == AbstractCodeJamBase.STREAM_TYPE) {
	    InputStream is = null;
	    OutputStream os = null;
	    try {
		is = new FileInputStream(input);
		os = new FileOutputStream(output);
		this.process(is, os);
	    } catch (FileNotFoundException e) {
		this.showUsage("FileNotFound: " + e.getLocalizedMessage());
	    } catch (IllegalArgumentException excIA) {
		this.showUsage(excIA.getLocalizedMessage());
	    } catch (Exception exc) {
		System.out.println("Program failed: " + exc.getLocalizedMessage());
		exc.printStackTrace(System.out);
	    } finally {
		if (is != null) {
		    try {
			is.close();
		    } catch (IOException e) {
			System.out.println("Failed to close input: " + e.getLocalizedMessage());
		    }
		}
		if (os != null) {
		    try {
			os.close();
		    } catch (IOException e) {
			System.out.println("Failed to close output: " + e.getLocalizedMessage());
		    }
		}
	    }
	} else if (type == AbstractCodeJamBase.READER_TYPE) {
	    BufferedReader reader = null;
	    PrintWriter pw = null;
	    try {
		reader = new BufferedReader(new FileReader(input));
		pw = new PrintWriter(output);
		this.process(reader, pw);
	    } catch (FileNotFoundException e) {
		this.showUsage("FileNotFound: " + e.getLocalizedMessage());
	    } catch (IllegalArgumentException excIA) {
		this.showUsage(excIA.getLocalizedMessage());
	    } catch (Exception exc) {
		System.out.println("Program failed: " + exc.getLocalizedMessage());
		exc.printStackTrace(System.out);
	    } finally {
		if (reader != null) {
		    try {
			reader.close();
		    } catch (IOException e) {
			System.out.println("Failed to close input: " + e.getLocalizedMessage());
		    }
		}
		if (pw != null) {
		    pw.close();
		}
	    }
	} else if (type == AbstractCodeJamBase.FILE_TYPE) {
	    try {
		this.process(input, output);
	    } catch (IllegalArgumentException excIA) {
		this.showUsage(excIA.getLocalizedMessage());
	    } catch (Exception exc) {
		System.out.println("Program failed: " + exc.getLocalizedMessage());
		exc.printStackTrace(System.out);
	    }
	} else {
	    this.showUsage("Unknown type given: " + type + " (accepted values: 0,1)");
	}
	System.out.println("  READY (" + (System.currentTimeMillis() - starttime) + " ms)");
    }

    /**
     * Read a single number from input
     * 
     * @param reader
     * @param purpose
     *            What is the purpose of given data
     * @return
     * @throws IOException
     * @throws IllegalArgumentException
     */
    protected int readInt(BufferedReader reader, String purpose) throws IOException, IllegalArgumentException {
	int ret = 0;
	String line = reader.readLine();
	if (line == null) {
	    throw new IllegalArgumentException("Invalid input: line is empty, it should be an integer (" + purpose + ")!");
	}
	try {
	    ret = Integer.parseInt(line);
	} catch (NumberFormatException excNF) {
	    throw new IllegalArgumentException("Invalid input: the first line '" + line + "' should be an integer (" + purpose + ")!");
	}
	return ret;
    }

    /**
     * Read array of integers
     * 
     * @param reader
     * @param purpose
     * @return
     */
    protected int[] readIntArray(BufferedReader reader, String purpose) throws IOException {
	int[] ret = null;
	String line = reader.readLine();
	if (line == null) {
	    throw new IllegalArgumentException("Invalid input: line is empty, it should be an integer list (" + purpose + ")!");
	}
	String[] strArr = line.split("\\s");
	int len = strArr.length;
	ret = new int[len];
	for (int i = 0; i < len; i++) {
	    try {
		ret[i] = Integer.parseInt(strArr[i]);
	    } catch (NumberFormatException excNF) {
		throw new IllegalArgumentException("Invalid input: line '" + line + "' should be an integer list (" + purpose + ")!");
	    }
	}
	return ret;
    }

    /**
     * Read array of strings
     * 
     * @param reader
     * @param purpose
     * @return
     */
    protected String[] readStringArray(BufferedReader reader, String purpose) throws IOException {
	String[] ret = null;
	String line = reader.readLine();
	if (line == null) {
	    throw new IllegalArgumentException("Invalid input: line is empty, it should be a string list (" + purpose + ")!");
	}
	ret = line.split("\\s");
	return ret == null ? new String[0] : ret;
    }

    /**
     * Basic usage pattern. Can be overwritten by current implementation
     * 
     * @param message
     *            Short message, describing the problem with given program
     *            arguments
     */
    protected void showUsage(String message) {
	if (message != null) {
	    System.out.println(message);
	}
	System.out.println("Usage:");
	System.out.println("\t" + this.getClass().getName() + " program");
	System.out.println("\tArguments:");
	System.out.println("\t\t<input folder>:\tpath of input folder (default: " + AbstractCodeJamBase.DEFAULT_INPUT + ").");
	System.out.println("\t\t               \tAll files will be processed in the folder");
	System.out.println("\t\t<output folder>:\tpath of output folder (default: " + AbstractCodeJamBase.DEFAULT_OUTPUT + ")");
	System.out.println("\t\t               \tOutput file name will be the same as input");
	System.out.println("\t\t               \tinput with extension '.out'");
	System.exit(-1);
    }
}

import java.util.Scanner;

/**
 * Abdulaziz
 * 4/13/12
 * Problem
 * <p/>
 * You're watching a show where Googlers (employees of Google) dance, and then each dancer is given a triplet of scores by three judges. Each triplet of scores consists of three integer scores from 0 to 10 inclusive. The judges have very similar standards, so it's surprising if a triplet of scores contains two scores that are 2 apart. No triplet of scores contains scores that are more than 2 apart.
 * <p/>
 * For example: (8, 8, 8) and (7, 8, 7) are not surprising. (6, 7, 8) and (6, 8, 8) are surprising. (7, 6, 9) will never happen.
 * <p/>
 * The total points for a Googler is the sum of the three scores in that Googler's triplet of scores. The best result for a Googler is the maximum of the three scores in that Googler's triplet of scores. Given the total points for each Googler, as well as the number of surprising triplets of scores, what is the maximum number of Googlers that could have had a best result of at least p?
 * <p/>
 * For example, suppose there were 6 Googlers, and they had the following total points: 29, 20, 8, 18, 18, 21. You remember that there were 2 surprising triplets of scores, and you want to know how many Googlers could have gotten a best result of 8 or better.
 * <p/>
 * With those total points, and knowing that two of the triplets were surprising, the triplets of scores could have been:
 * <p/>
 * 10 9 10
 * 6 6 8 (*)
 * 2 3 3
 * 6 6 6
 * 6 6 6
 * 6 7 8 (*)
 * The cases marked with a (*) are the surprising cases. This gives us 3 Googlers who got at least one score of 8 or better. There's no series of triplets of scores that would give us a higher number than 3, so the answer is 3.
 * Input
 * <p/>
 * The first line of the input gives the number of test cases, T. T test cases follow. Each test case consists of a single line containing integers separated by single spaces. The first integer will be N, the number of Googlers, and the second integer will be S, the number of surprising triplets of scores. The third integer will be p, as described above. Next will be N integers ti: the total points of the Googlers.
 * <p/>
 * Output
 * <p/>
 * For each test case, output one line containing "Case #x: y", where x is the case number (starting from 1) and y is the maximum number of Googlers who could have had a best result of greater than or equal to p.
 * <p/>
 * Limits
 * <p/>
 * 1 â¤ T â¤ 100.
 * 0 â¤ S â¤ N.
 * 0 â¤ p â¤ 10.
 * 0 â¤ ti â¤ 30.
 * At least S of the ti values will be between 2 and 28, inclusive.
 * Small dataset
 * <p/>
 * 1 â¤ N â¤ 3.
 * Large dataset
 * <p/>
 * 1 â¤ N â¤ 100.
 * Sample
 * <p/>
 * <p/>
 * Input
 * <p/>
 * Output
 * <p/>
 * 4
 * 3 1 5 15 13 11
 * 3 0 8 23 22 21
 * 2 1 1 8 0
 * 6 2 8 29 20 8 18 18 21
 * Case #1: 3
 * Case #2: 2
 * Case #3: 1
 * Case #4: 3
 */
public class Problem2 {
    public static void main(String[] args) {
        /*4
        3 1 5 15 13 11
        3 0 8 23 22 21
        2 1 1 8 0
        6 2 8 29 20 8 18 18 21
        Case #1: 3
        Case #2: 2
        Case #3: 1
        Case #4: 3
        */
        String sLines = args[0];
        int lines = Integer.valueOf(sLines);
        String[] inputs = new String[lines];
        Scanner in = new Scanner(System.in);

        for (int i = 0; i < Integer.valueOf(sLines); i++) {
            inputs[i] = in.nextLine();
        }

        for (int i = 1; i <= inputs.length; i++) {
            System.out.println("Case #" + i + ": " + analyze(inputs[i - 1].trim()));
        }


    }

    private static int analyze(String str) {
                    String[] arg = str.split(" ");
            int googler = Integer.valueOf(arg[0]);
            int suprising = Integer.valueOf(arg[1]);
            int condition = Integer.valueOf(arg[2]);
            int found = 0;

            for (int i = 3; i < googler + 3; i++) {
                int sum = Integer.valueOf(arg[i]);
               // int del = sum / 3;

                if (condition == 0) {
                    found++;
                    continue;
                }

                if (condition == 1 && sum >= 1) {
                    found++;
                    continue;
                }

                if (sum < 2)
                    continue;

                if (3 * condition - 4 <= sum && sum < 3 * condition - 2) {

                    if (suprising == 0)
                        continue;

                    suprising--;
                    found++;
                } else {
                    if (sum >= 3 * condition - 2)
                        found++;
                }

    }
        return found;
    }


}
