Pagini recente » Cod sursa (job #375500) | Cod sursa (job #749926) | Cod sursa (job #1734407) | Cod sursa (job #556118) | Cod sursa (job #1669926)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 100009;
const int cmax = 100000;
ifstream fin("nums.in");
ofstream fout("nums.out");
struct trie
{
int cnt;
trie *link[10];
trie()
{
cnt = 0;
for (int i = 0 ; i <= 9 ; ++i)
link[i] = 0;
}
};
int st[4 * nmax];
trie *root[nmax];
int n , m , k , i , t;
string act;
void add(int x , int l , int r , int p)
{
if (l == r)
{
st[x]++;
return ;
}
int c = (l + r) / 2;
if (p <= c) add(2 * x , l , c , p);
else add(2 * x + 1 , c + 1 , r , p);
st[x] = st[2 * x] + st[2 * x + 1];
}
int query(int x , int l , int r)
{
if (l == r) return r;
int c = (l + r) / 2;
if (k <= st[2 * x]) query(2 * x , l , c);
else
{
k -= st[2 * x];
query(2 * x + 1 , c + 1 , r);
}
}
bool runSearch(trie *root , int p)
{
if (p == n) return false;
int to = act[p] - '0';
if (root -> link[to]) runSearch(root -> link[to] , p + 1);
else return false;
}
void runInsert(trie *root , int p)
{
root -> cnt++;
if (p == n) return ;
int to = act[p] - '0';
if (root -> link[to]);
else root -> link[to] = new trie();
runInsert(root -> link[to] , p + 1);
}
void runWrite(trie *root , int p , int k)
{
if (p == n) return ;
for (int i = 0 ; i <= 9 ; ++i)
if (root -> link[i])
{
if (root -> link[i] -> cnt >= k)
{
fout << i;
runWrite(root -> link[i] , p + 1 , k);
return ;
}
else k -= root -> link[i] -> cnt;
}
}
int main()
{
for (i = 1 ; i <= cmax ; ++i)
root[i] = new trie();
for (fin >> m ; m ; --m)
{
fin >> t;
if (t == 1)
{
fin >> act;
n = act.size();
if (runSearch(root[n] , 0)) ;
else
{
runInsert(root[n] , 0);
add(1 , 1 , cmax , n);
}
}
else
{
fin >> k;
n = query(1 , 1 , cmax);
runWrite(root[n] , 0 , k);
fout << "\n";
}
}
return 0;
}