#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_ON			1										// 汎用フラグ - ON
#define D_OFF			0										// 汎用フラグ - OFF
#define D_STR_MAX		5										// 最大文字数
#define D_NUM_CNT		10										// 数字数

// 内部変数
static char sc1Money[D_STR_MAX + 5];							// 金額
static int siMCnt;												// 金額数
static char sc1Num[D_NUM_CNT];									// 使用可能数字
static char sc1Pay[D_STR_MAX + 5];								// 支払額

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpT, *szpFpA;
#endif

// 同一値をセット
// 戻り値：[0]同一値 [1]オーバー値をセット [-1]セットなし
int
fSetSame(
	int piNo					// <I> 位置 0～
)
{
	int i;

	for (i = 0; i < D_NUM_CNT; i++) {

		// 使用可能数字チェック
		if (sc1Num[i] != D_ON) {
			continue;
		}

		// 数字
		char lcNum = '0' + i;

		// 金額比較
		if (sc1Money[piNo] == lcNum) {
			sc1Pay[piNo] = lcNum;
			return 0;
		}
		else if (sc1Money[piNo] < lcNum) {
			sc1Pay[piNo] = lcNum;
			return 1;
		}
	}

	return -1;
}

// オーバー値をセット
int
fSetOver(
	int piNo					// <I> 位置 0～
)
{
	int i;

	for (i = 0; i < D_NUM_CNT; i++) {

		// 使用可能数字チェック
		if (sc1Num[i] != D_ON) {
			continue;
		}

		// 数字
		char lcNum = '0' + i;

		// 金額比較
		if (sc1Money[piNo] < lcNum) {
			sc1Pay[piNo] = lcNum;
			return 0;
		}
	}

	return -1;
}

// 最低値をセット
int
fSetMin(
	int piNo					// <I> 位置 0～
)
{
	int i;

	for (i = 0; i < D_NUM_CNT; i++) {

		// 使用可能数字チェック
		if (sc1Num[i] != D_ON) {
			continue;
		}

		// 数字
		sc1Pay[piNo] = '0' + i;

		return 0;
	}

	return 0;
}

// 支払額セット
int
fSetPay(
)
{
	int i, liRet;

	// 同一値をセット
	sc1Pay[0] = '0';
	for (i = 1; i < siMCnt; i++) {
		liRet = fSetSame(i);
		if (liRet != 0) {
			break;
		}
	}
	if (liRet == 0) {
		return 0;
	}

	// 最低値をセット
	if (liRet == 1) {
		for (i++; i < siMCnt; i++) {
			fSetMin(i);
		}
		return 0;
	}

	// オーバー値をセット
	for (i--; i >= 0; i--) {
		liRet = fSetOver(i);
		if (liRet == 0) {
			break;
		}
	}

	// 最低値をセット
	for (i++; i < siMCnt; i++) {
		fSetMin(i);
	}

	return 0;
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int i;
	char lc1Buf[1024], lc1Out[1024];

	// データ初期化
	memset(sc1Num, D_ON, sizeof(sc1Num));						// 使用可能数字
	memset(sc1Pay, '\0', sizeof(sc1Pay));						// 支払額

	// テストファイルオープン
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpT = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#endif

	// 金額・使用不可数字数取得
	int liNCnt;
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
	sscanf(lc1Buf, "%s%d", &sc1Money[1], &liNCnt);
	sc1Money[0] = '0';

	// 金額数
	siMCnt = strlen(sc1Money);

	// 使用不可数字取得
	for (i = 0; i < liNCnt; i++) {
		int liNum;
#ifdef D_TEST
		fscanf(szpFpT, "%d", &liNum);
#else
		fscanf(stdin, "%d", &liNum);
#endif
		sc1Num[liNum] = D_OFF;
	}
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif

	// 支払額セット
	fSetPay();

	// 結果セット
	if (sc1Pay[0] == '0') {
		sprintf(lc1Out, "%s\n", &sc1Pay[1]);
	}
	else {
		sprintf(lc1Out, "%s\n", sc1Pay);
	}

	// 結果表示
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpT);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}



Measured memory_bytes: 384