Pagini recente » Cod sursa (job #2217816) | Cod sursa (job #1312430) | Cod sursa (job #441406) | Cod sursa (job #1040886) | Cod sursa (job #940898)
Cod sursa(job #940898)
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
struct entry
{
string nr;
entry *left, *right;
int total;
entry()
{
left = right = NULL;
total = 0;
}
};
entry *root = new entry();
int n, k;
string curr;
inline int comp(string s1, string s2)
{
if (s1.size() < s2.size())
return 1;
if (s1.size() > s2.size())
return -1;
int i;
for (i = 0; i < s1.size(); i++)
{
if (s1[i] < s2[i])
return 1;
if (s1[i] > s2[i])
return -1;
}
return 0;
}
void add(entry *node)
{
if (node -> total == 0)
{
node -> nr = curr;
node -> total = 1;
return ;
}
if (comp(node -> nr, curr) == 0)
return ;
if (comp(node -> nr, curr) == -1)
{
if (node -> left == NULL)
node -> left = new entry();
add(node -> left);
}
else
{
if (node -> right == NULL)
node -> right = new entry();
add(node -> right);
}
int sons = 1;
if (node -> left != NULL)
sons += node -> left -> total;
if (node -> right != NULL)
sons += node -> right -> total;
node -> total = sons;
}
string search(entry *node)
{
if (node -> left != NULL)
{
if (node -> left -> total >= k)
return search(node -> left);
k -= node -> left -> total;
}
if (k == 1)
return node -> nr;
k--;
return search(node -> right);
}
int main()
{
freopen("nums.in", "r", stdin);
freopen("nums.out", "w", stdout);
cin >> n;
int i, tip;
for (i = 1; i <= n; i++)
{
cin >> tip;
if (tip == 1)
{
cin >> curr;
add(root);
}
else
{
cin >> k;
cout << search(root) << '\n';
}
}
return 0;
}