import java.util.*;

class Manager implements Runnable
{
  List q;
  int[] inUse;

  Manager(int _num)
  {
    q=Collections.synchronizedList(new LinkedList());
    inUse=new int[_num];
    for(int i=0;i<_num;i++)
      inUse[i]=-1;

    new Thread(this).start();
  }

  int anfordern(int _pid)
  {
    RequestEvent e=new RequestEvent(RequestEvent.ACTION_ACQUIRE,_pid,0);
    q.add(e);
    while(e.result==Integer.MIN_VALUE)
      Thread.yield();
    return e.result;
  }

  boolean freigeben(int _i,int _pid)
  {
    RequestEvent e=new RequestEvent(RequestEvent.ACTION_RELEASE,_pid,_i);
    q.add(e);
    while(e.result==Integer.MIN_VALUE)
      Thread.yield();
    return (e.result!=0);
  }

  public void run()
  {
    while(true)
    {
      while(!q.isEmpty())
      {
        RequestEvent e=(RequestEvent)(q.get(0));
        q.remove(0);

        switch(e.action)
        {
          case RequestEvent.ACTION_ACQUIRE:
            int found=-1;
            for(int i=0;i<inUse.length;i++)
              if(inUse[i]==-1)
              {
                found=i;
                inUse[i] = e.pid;
                break;
              }
              e.result=found;
            break;
          case RequestEvent.ACTION_RELEASE:
            if(inUse[e.i]!=e.pid)
              e.result=0;
            else
            {
              e.result=1;
              inUse[e.i]=-1;
            }
            break;
        }
      }
      try{Thread.sleep(100);}catch(Exception e){}
    }
  }
}

class RequestEvent
{
  public static final int ACTION_ACQUIRE=0;
  public static final int ACTION_RELEASE=1;

  public int action;
  public int pid;
  public int i;
  public int result;

  RequestEvent(int _action,int _pid,int _i)
  {
    action=_action;
    pid=_pid;
    i=_i;
    result=Integer.MIN_VALUE;
  }
}