1.

package acm_11525_permutation;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* FWP, Ausgew¦hlte Probleme aus dem ACM Programming Contest, SS10
* Problem: acm_11525_permutation
* Link:
*
* @author Martin Lambeck
* @version 1.0, 23.10.2010
*
* Method : B-Tree
* Status : Accepted
* Runtime: 0.840
*/


public class Main
{
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static Node root;

public static void main(String... args) throws IOException
{
root = Node.init(1, 50001);


int cases = Integer.parseInt(reader.readLine());

for (int i = 0; i < cases; i++)
testcase();
}

public static void testcase() throws IOException
{
int k = Integer.parseInt(reader.readLine());
String[] si = reader.readLine().split(" ");

root.reset();


StringBuffer sol = new StringBuffer();

for (int i = 0; i < k; i++)
{
int n = Integer.parseInt(si[i]);
int d = root.get(n).num;

root.delete(d);

if (i > 0)
sol.append(" ");

sol.append(d);
}

System.out.println(sol.toString());

}
}

//B-Tree which allows to delete Items. Items can be accessed by index.
class Node
{
Node low = null; // left/lower subtree
Node high = null; // right/higher subtree
int num = -1; // number of this node
int lower = -1; // number of nodes in left subtree (incl. root of lower subtree)
int initLower = -1; // value of lower, if no node was deleted (used on reset())
boolean deleted = false; //this node was deleted

public Node (int n)
{
num = n;
}

public int count() //number of nodes in both subtrees
{
return (low != null ? low.count() + 1 : 0) + (high != null ? high.count() + 1 : 0);
}

public void reset()
{
lower = initLower;
deleted = false;

if (low != null)
low.reset();

if (high != null)
high.reset();
}

public void delete(int n) //delete Node where num==n
{
if (n == num)
deleted = true;

if (n < num)
lower--;

if (n < num)
low.delete(n);

if (n > num)
high.delete(n);
}

public Node get(int i) //get Node of INDEX i (starts with 0)
{
if ((i == lower) && !deleted)
return this;

if (i < lower)
return low.get(i);

return high.get(i - lower - (deleted ? 0 : 1));
}

static Node init(int from, int to)
{
Node nod;

int mid = (to + from) / 2;

nod = new Node(mid);

if ((mid-1) >= from)
nod.low = init(from, mid-1);

if ((mid+1) <= to)
nod.high = init(mid+1, to);

nod.initLower = (nod.low != null ? nod.low.count() + 1 : 0); //nodes in low-subtree
nod.lower = nod.initLower;

return nod;
}
}