#include <bits/stdc++.h>
using namespace std;
const int maxn = 1E6 + 10;
int T, n, m, inp, last[maxn];
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false), cin.tie(NULL);
cin >> T;
while (T--)
{
cin >> n >> m;
bool NoSolution = 0;
memset(last, 0, sizeof(last));
set<int>FreeDays; map<int, int>ans;
for (int i = 1; i <= m; i++)
{
cin >> inp; if (NoSolution) continue;
if (inp == 0) FreeDays.insert(i), ans[i] = 0;
else
{
auto it = FreeDays.lower_bound(last[inp]);
if (it != FreeDays.end())
{
ans[*it] = inp;
last[inp] = i;
FreeDays.erase(it);
}
else NoSolution = 1;
}
}
if (!NoSolution)
{
cout << "YES" << endl;
for (auto it = ans.begin(); it != ans.end(); it++)
cout << it->second << (it == --ans.end() ? "\n" : " ");
}
else cout << "NO" << endl;
}
return 0;
}
LOWER_BOUND 果然快,vector超时
贪心:每次遇到向满水的湖中下雨时,时光倒流到上一次满水之后的第一个没有下雨的日子清空湖水即可