#include using namespace std; int f(char c) { if(c=='C'||c=='E') return 0; return 1; } struct node { int l; int r; int val; int lazy; }tree[4*100005][2]; void build(int idx,int l,int r,int flag) { tree[idx][flag].l=l;tree[idx][flag].r=r;tree[idx][flag].val=0;tree[idx][flag].lazy=0; if(l==r) return ; int mid=(l+r)/2; build(idx*2,l,mid,flag); build(idx*2+1,mid+1,r,flag); } void pushdown(int idx,int flag) { tree[idx*2][flag].lazy+=tree[idx][flag].lazy; tree[idx*2+1][flag].lazy+=tree[idx][flag].lazy; tree[idx*2][flag].val+=tree[idx][flag].lazy; tree[idx*2+1][flag].val+=tree[idx][flag].lazy; tree[idx][flag].lazy=0; } void update(int idx,int l,int r,int v,int flag) { //cout<mid) update(idx*2+1,l,r,v,flag); else { update(idx*2,l,mid,v,flag); update(idx*2+1,mid+1,r,v,flag); } tree[idx][flag].val=max(tree[idx*2][flag].val,tree[idx*2+1][flag].val); } int query(int idx,int l,int r,int flag) { if(tree[idx][flag].l==l&&tree[idx][flag].r==r) { return tree[idx][flag].val; } if(tree[idx][flag].lazy!=0) pushdown(idx,flag); int mid=(tree[idx][flag].l+tree[idx][flag].r)/2; int ans=0; if(r<=mid) { ans=query(idx*2,l,r,flag); } else if(l>mid) { ans=query(idx*2+1,l,r,flag); } else { ans=max(query(idx*2,l,mid,flag),query(idx*2+1,mid+1,r,flag)); } return ans; } int ans[100005]; vectorA[2][100005]; vectorfin; vector minimumZooNumbers(int m, int n, vector t, vector s, vector d) { // Return a list of length n consisting of the answers for(int i=0;i<2;i++) for(int j=1;j<=m;j++) A[i][j].clear(); build(1,1,m,0); build(1,1,m,1); for(int i=0;id[i]) continue; A[type][d[i]].push_back(s[i]); } for(int i=0;i<2;i++) for(int j=1;j<=m;j++) sort(A[i][j].begin(),A[i][j].end()); for(int i=1;i<=n;i++) ans[i]=m+1; for(int i=1;i<=m;i++) { for(int k=0;k<2;k++) { int te=0; for(int j=0;jA[k][i][j]) continue; update(1,last,A[k][i][j],A[k][i].size()-j,k^1); last=A[k][i][j]+1; } } int p=max(tree[1][0].val,tree[1][1].val); ans[p]=min(ans[p],i); } for(int i=n-1;i>=1;i--) ans[i]=min(ans[i],ans[i+1]); for(int i=1;i<=n;i++) if(ans[i]>m) ans[i]=-1; fin.clear(); for(int i=1;i<=n;i++) fin.push_back(ans[i]); return fin; } int main() { int cases; cin >> cases; for(int a0 = 0; a0 < cases; a0++){ int m; int n; cin >> m >> n; vector t(n); for(int t_i = 0; t_i < n; t_i++){ cin >> t[t_i]; } vector s(n); for(int s_i = 0; s_i < n; s_i++){ cin >> s[s_i]; } vector d(n); for(int d_i = 0; d_i < n; d_i++){ cin >> d[d_i]; } vector result = minimumZooNumbers(m, n, t, s, d); for (ssize_t i = 0; i < result.size(); i++) { cout << result[i] << (i != result.size() - 1 ? " " : ""); } cout << endl; } return 0; }