Pagini recente » Cod sursa (job #2473334) | Cod sursa (job #2828430) | Cod sursa (job #1759879) | Cod sursa (job #561144) | Cod sursa (job #1072175)
#include <cstdio>
#include <cstring>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;
struct item
{
string key;
int priority, no;
item *left, *right;
item() { no = 0; };
item(string key, int priority, item *left, item *right)
{
this -> key = key;
this -> priority = priority;
this -> left = left;
this -> right = right;
recompute();
}
item(string key, int priority, item *left, item *right, int no) : no(no) { item(key, priority, left, right); };
void recompute() { no = (left ? left -> no : 0) + (right ? right -> no : 0) + 1; }
};
typedef item * pitem;
pitem R, nil;
void init()
{
srand(time(0));
R = nil = new item("", 0, NULL, NULL, 0);
}
#define NMAX 100005
int n;
char line[NMAX];
inline bool comp_string(string s1, string s2)
{
if (s1.size() != s2.size())
return s1.size() < s2.size();
return s1 < s2;
}
void rotleft(pitem &n)
{
pitem t = n -> left;
n -> left = t -> right;
t -> right = n;
n -> recompute();
t -> recompute();
n = t;
}
void rotright(pitem &n)
{
pitem t = n -> right;
n -> right = t -> left;
t -> left = n;
n -> recompute();
t -> recompute();
n = t;
}
void balance(pitem &n)
{
if (n -> left -> priority > n -> priority)
rotleft(n);
else
if (n -> right -> priority > n -> priority)
rotright(n);
n -> recompute();
}
string keyString;
void insert(pitem &n)
{
if (n == nil)
{
n = new item(keyString, rand() + 1, nil, nil);
return ;
}
if (comp_string(keyString, n -> key))
insert(n -> left);
else
if (comp_string(n -> key, keyString))
insert(n -> right);
balance(n);
}
string getNth(pitem &n, int &no)
{
if (n -> left -> no >= no)
return getNth(n -> left, no);
else
{
no -= n -> left -> no;
if (no == 1)
return n -> key;
return getNth(n -> right, --no);
}
}
int main()
{
//~ freopen("input", "r", stdin);
freopen("nums.in", "r", stdin);
freopen("nums.out", "w", stdout);
init();
scanf("%d", &n);
int type;
while (n--)
{
scanf("%d", &type);
if (type)
{
scanf("%s", line);
keyString = line;
insert(R);
}
else
{
int no;
scanf("%d", &no);
printf("%s\n", getNth(R, no).c_str());
}
}
return 0;
}