Pagini recente » Cod sursa (job #802657) | Cod sursa (job #2116465) | Cod sursa (job #1269585) | Cod sursa (job #1050551) | Cod sursa (job #1072174)
#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();
for (int i = 0; i < (int)s1.size(); i++)
{
if (s1[i] < s2[i])
return 1;
if (s1[i] > s2[i])
return 0;
}
return 0;
}
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();
}
void insert(pitem &n, string &key)
{
if (n == nil)
{
n = new item(key, rand() + 1, nil, nil);
return ;
}
if (comp_string(key, n -> key))
insert(n -> left, key);
else
if (comp_string(n -> key, key))
insert(n -> right, key);
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);
string no(line);
insert(R, no);
}
else
{
int no;
scanf("%d", &no);
printf("%s\n", getNth(R, no).c_str());
}
}
return 0;
}