#include<stdio.h>
#include<stdlib.h>

#define MAX 1000
struct Task{
    int TaskID;
    int p;
};
struct Task heap[MAX];
int size=0;

void swap(struct Task*a,struct Task*b){
    struct Task temp=*a;
    *a=*b;
    *b=temp;
}
void heapifyUp(int index){
    if(index<=0)
    return;
    int parent=(index-1)/2;
    if(heap[index].p<heap[parent].p){
        swap(&heap[index],&heap[parent]);
        heapifyUp(parent);
    }
}
void heapify_down(int index){
    int left=2*index+1;
    int right=2*index+2;
    int smallest=index;
    if(left<size&&heap[left].p<heap[smallest].p)
        smallest=left;
    if(right<size&&heap[right].p<heap[smallest].p)
        smallest=right;
    if(smallest!=index){
        swap(&heap[index],&heap[smallest]);
        heapify_down(smallest);
    }
}
void insert(int TaskID,int Priority){
    heap[size].TaskID=TaskID;
    heap[size].Priority=Priority;
    heapifyUp(size);
    size++;
    printf("Task Added: %d\n",TaskID);
}
struct Task extract_task(){
    struct Task min_task=heap[0];
    heap[0]=heap[size-1];
    size--;
    heapify_down(0);
    return min_task;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int TaskID,Priority;
        scanf("%d%d",&TaskID,&Priority);
        if(TaskID<0 || Priority<0){
            printf("Invalid input\n");
            continue;
        }
        insert(TaskID,Priority);
    }
    printf("Task with Highest Priority: %d\n",heap[0].TaskID);
    return 0;
}