Pagini recente » Cod sursa (job #1473356) | Autentificare | Cod sursa (job #2039077) | Cod sursa (job #467066) | Cod sursa (job #306856)
Cod sursa(job #306856)
#include <algorithm>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#define MAX 100010
using namespace std;
class Trie
{
public:
int sfin, sub;
Trie* fii[10];
Trie()
{
this->sfin = 0, this->sub = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie* radTrie[MAX];
string strFin;
char strQ[MAX];
int k;
inline int insertTrie(Trie *nodTrie, char s[])
{
if (s[0] == '\n')
{
if (nodTrie->sfin)
return 0;
nodTrie->sfin = 1;
nodTrie->sub++;
return 1;
}
else
{
int suc = s[0] - '0';
if (!nodTrie->fii[suc])
nodTrie->fii[suc] = new Trie;
int ad = insertTrie(nodTrie->fii[suc], s + 1);
nodTrie->sub += ad;
return ad;
}
}
inline void scoateTrie(Trie *nodTrie, int ind)
{
ind -= nodTrie->sfin;
if (!ind)
return;
int i = 0;
for (; i < 10; i++)
if (nodTrie->fii[i])
{
int r = nodTrie->fii[i]->sub;
if (ind > r)
ind -= r;
else break;
}
strFin += (char) i + '0';
scoateTrie(nodTrie->fii[i], ind);
}
int main()
{
for (int i = 1; i <= 100000; i++)
radTrie[i] = new Trie;
freopen("nums.in", "r", stdin);
freopen("nums.out", "w", stdout);
for (scanf("%d\n", &k); k; k--)
{
fgets(strQ, MAX, stdin);
if (strQ[0] == '1')
insertTrie(radTrie[strlen(strQ) - 3], strQ + 2);
else
{
int nr = 0;
for (int i = 2, lung = strlen(strQ) - 1; i < lung; i++)
nr = nr * 10 + strQ[i] - '0';
strFin.clear();
int i = 1;
for (; i <= 100000; i++)
if (!(nr > radTrie[i]->sub))
break;
else nr -= radTrie[i]->sub;
scoateTrie(radTrie[i], nr);
cout << strFin;
printf("\n");
}
}
fclose(stdin);
fclose(stdout);
return 0;
}