Pagini recente » Cod sursa (job #2502034) | Cod sursa (job #1850626) | Cod sursa (job #999995) | Cod sursa (job #2968531) | Cod sursa (job #1315629)
#include <fstream>
#include <string>
#include <vector>
#include <map>
using namespace std;
struct str
{
int x,tip;
}v[100010];
string sir[100010];
int aib[100010],norm[100010],n,logn,nr;
char vaz[100010];
class trie
{
public:
trie():
rad(new node()) {}
void insert(string sir,int x,int y)
{
node *nod=rad;
int lim=sir.size();
for(int i=0;i<lim;i++)
{
if(nod->fiu.count(sir[i])==0) nod->fiu[sir[i]]=new node();
nod=nod->fiu[sir[i]];
}
nod->poz.push_back(x);
nod->m=y;
}
void solve()
{
solve(rad);
}
private:
struct node
{
int m;
vector<int> poz;
map<char,node*> fiu;
node()
{
m=0;
poz=vector<int>();
fiu=map<char,node*>();
}
};
node *rad;
void solve(node *nod)
{
if(nod->poz.size())
{
nr++;
norm[nr]=nod->m;
for(vector<int>::iterator it=nod->poz.begin();it!=nod->poz.end();it++) v[*it].x=nr;
return;
}
for(map<char,node*>::iterator it=nod->fiu.begin();it!=nod->fiu.end();it++) solve(it->second);
}
}t[100010];
void aib_update(int i)
{
for(;i<=n;i+=i&(-i)) aib[i]++;
}
int cautbin(int s)
{
int x=0;
for(int i=logn;i>=0;i--)
if(x+(1<<i)<=n && s>aib[x+(1<<i)])
{
x+=1<<i;
s-=aib[x];
}
return x+1;
}
int main()
{
ifstream f("nums.in");
ofstream g("nums.out");
int m=0;
f>>n;
for(logn=1;1<<(logn+1)<=n;logn++);
for(int i=1;i<=n;i++)
{
f>>v[i].tip;
if(v[i].tip)
{
f>>sir[++m];
if(!vaz[sir[m].size()])
{
t[sir[m].size()]=trie();
vaz[sir[m].size()]=1;
}
t[sir[m].size()].insert(sir[m],i,m);
}
else f>>v[i].x;
}
for(int i=1;i<=100000;i++)
t[i].solve();
for(int i=1;i<=n;i++)
if(v[i].tip) aib_update(v[i].x);
else
{
int x=cautbin(v[i].x);
g<<sir[norm[x]]<<"\n";
}
return 0;
}