https://www.acmicpc.net/problem/1508


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
    static int length;
    static int refereeCount;
    static int pointCount;
    static int[] points;
    static int[] status;
    static void input() {
        Reader scanner = new Reader();
        length = scanner.nextInt();
        refereeCount = scanner.nextInt();
        pointCount = scanner.nextInt();
        points = new int[pointCount];
        for (int idx = 0; idx < pointCount; idx++) {
            points[idx] = scanner.nextInt();
        }
    }
    /*
     * 가장 가까운 두 심판의 거리를 이분 탐색을 통해 구할 매개 변수로 정하고
     * 이분 탐색을 통해 가장 가까운 두 심판의 거리의 최댓값을 구한다
     * 각 탐색마다 가장 가까운 거리가 정해지는데, 해당 거리가 가장 가까운 거리일 때 세울 수 있는 심판의 수를 구한다
     * 심판이 M명 세워질 때의 거리 중 최댓값을 구하고, 사전순 가장 늦는 것을 출력해야하므로 1번부터 세워보며 세울 M명을 구한다
     */
    static void solution() {
        int minDistance = binarySearch();
        findAssignedRefereeCount(minDistance, true);
        printAnswer();
    }
    static void printAnswer() {
        StringBuilder answer = new StringBuilder();
        int count = 0;
        for (int idx = 0; idx < pointCount; idx++) {
            if (count >= refereeCount) {
                answer.append(0);
                continue;
            }
            answer.append(status[idx]);
            if (status[idx] == 1) {
                count++;
            }
        }
        System.out.println(answer);
    }
    static int binarySearch() {
        int left = 0;
        int right = length;
        while (left <= right) {
            int mid = (left + right) / 2;
            int assignedRefereeCount = findAssignedRefereeCount(mid, false);
            if (assignedRefereeCount >= refereeCount) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return right;
    }
    static int findAssignedRefereeCount(int minDistance, boolean isFindingAnswerProceed) {
        int answer = 0;
        for (int basisIdx = 0; basisIdx < pointCount; basisIdx++) {
            status = new int[pointCount];
            status[basisIdx] = 1;
            int count = 1;
            int curPoint = points[basisIdx];
            for (int otherIdx = basisIdx + 1; otherIdx < pointCount; otherIdx++) {
                if (points[otherIdx] - curPoint >= minDistance) {
                    status[otherIdx] = 1;
                    curPoint = points[otherIdx];
                    count++;
                }
            }
            if (isFindingAnswerProceed && count >= refereeCount) {
                return count;
            }
            answer = Math.max(answer, count);
        }
        return answer;
    }
    public static void main(String[] args) {
        input();
        solution();
    }
    static class Reader {
        BufferedReader br;
        StringTokenizer st;
        public Reader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }
        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }
        int nextInt() {
            return Integer.parseInt(next());
        }
    }
}