#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Covek {
	int val;
	int id;
};

bool rastuce(const Covek& a, const Covek& b) {
	return a.val < b.val;
}

bool opadajuce(const Covek& a, const Covek& b) {
	return a.val > b.val;
}

void resi() {
	// 1) ULAZ
    
    int t;  //da li pantu zanima redosled?
    cin >> t;
    
    int n;  //broj ljudi koji ce da vide blog
    int k;  //zeljena uvazenost
    cin >> n >> k;
    
    vector<Covek> a(n);
    for(int i = 0; i<n; i++) {
    	cin >> a[i].val;
    	a[i].id = i+1;
	}
	
	// 2) USLOVI
	
	if((n+k) % 2 != 0 || k < -n || k > n) {
		cout << "NE" << '\n';
		return;
	}
	
	// 3) VEKTORI HEJTERA I LAJKERA
	
	int P = (n+k)/2;	//broj potrebnih za +1
	int M = n-P;	//broj potrebnih za -1
	
	sort(a.begin(), a.end(), rastuce);
	
	vector<Covek> hejteri(a.begin(), a.begin() + M);
	sort(hejteri.begin(), hejteri.end(), opadajuce);
	
	vector<Covek> lajkeri(a.begin() + M, a.end());
	
	// 4) PRAVIMO NIZ
	
	vector<int> redosled;
	
	int x = 0;	//indeks za lajkove
	int y = 0;	//indeks za hejtove
	int S = 0;	//uvazenost
	
	while(x < P || y < M) {
		bool potez_odigran = false;
		if(x < P && S <= lajkeri[x].val) {
			S++;
			redosled.push_back(lajkeri[x].val);
			x++;
			potez_odigran = true;
		}
		else if(y < M && S > hejteri[y].val){
			S--;
			redosled.push_back(hejteri[y].val);
			y++;
			potez_odigran = true;
		}
		
		if(!potez_odigran) {
			cout << "NE" << '\n';
			return;
		}
	}
	
	cout << "DA" << '\n';
	if(t == 1) {
		for(int r : redosled) {
			cout << r << " ";
		}
	}
	
	
}

int main()
{
    ios_base::sync_with_stdio(false);\
    cin.tie(nullptr);
    
    resi();

    return 0;
}