#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template <class T> inline void gmin(T &a,T b){if(b<a)a=b;}
const int N=1000+5,M=0,Z=1e9+7,ms63=1061109567;
map<string,int>mop;
char s[N][36];
int v[N];
int n;
int main()
{
while(~scanf("%d",&n))
{
mop.clear();
for(int i=1;i<=n;++i)
{
scanf("%s%d",s[i],&v[i]);
mop[s[i]]+=v[i];
}
int maxv=-1e9;
for(map<string,int>::iterator it=mop.begin();it!=mop.end();++it)gmax(maxv,it->second);
for(map<string,int>::iterator it=mop.begin();it!=mop.end();++it)
{
if(it->second==maxv)it->second=0;
else it->second=-1e9;
}
for(int i=1;i<=n;++i)
{
mop[s[i]]+=v[i];
if(mop[s[i]]>=maxv)
{
puts(s[i]);
break;
}
}
}
return 0;
}
/*
【trick&&吐槽】
模拟题,脑补题意就是作大死呀!
1,比赛的人数不只是有2个,而是有若干个
2,最高分应在最后统计,因为过程中达到的最高分,不代表最后全局还拥有这个最高分(可能被减掉)
【题意】
若干个人参加比赛。
有n(1<=n<=1000)次得分情况。
每次得分情况,我们会告诉你(人名 得分),得分范围是[-1000,1000]
1,获胜者要求最后得分最高
2,出现重复则输出第一个达到最高分(是大于等于不是等于)这个分数的人名。
【类型】
模拟
【分析】
直接用map模拟即可。可以先模拟一遍,统计一个最高分。
然后再模拟一遍,凡是最后是最高分的人,第一个达到最高分者就为胜者。
【时间复杂度&&优化】
O(n * lg(map常数) )
*/
import java.util.*;
import java.math.*;
public class Main
{
static Scanner cin = new Scanner(System.in);
public static void main(String[] args)
{
HashMap<String,Integer> mop=new HashMap<String,Integer>();
String a[]=new String[1010];
int b[]=new int[1010];
int n=cin.nextInt();
for(int i=1;i<=n;++i)
{
a[i]=cin.next();
b[i]=cin.nextInt();
int x=b[i];
if(mop.containsKey(a[i]))x+=(int)mop.get(a[i]);
mop.put(a[i],x);
}
int maxv=Integer.MIN_VALUE;
for(Object obj:mop.keySet())maxv=Math.max(maxv,(int)mop.get(obj));
for(Object obj:mop.keySet())
{
if((int)mop.get(obj)==maxv)mop.put(obj.toString(),0);
else mop.put(obj.toString(),Integer.MIN_VALUE);
}
for(int i=1;i<=n;i++)
{
int x=b[i];
if(mop.containsKey(a[i]))x+=(int)mop.get(a[i]);
mop.put(a[i],x);
if(x>=maxv)
{
System.out.println(a[i]);
break;
}
}
}
}