Pagini recente » Cod sursa (job #465933) | Cod sursa (job #2604964) | Cod sursa (job #1279889) | Cod sursa (job #2693277) | Cod sursa (job #1315618)
#include <fstream>
#include <string>
#include <vector>
#include <map>
using namespace std;
struct str
{
int tip,x;
}v[100010];
string sir[100010];
int aib[100010],norm[100010],n,logn,nr;
class trie
{
public:
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=new node();
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()
{
//freopen("nums.in", "r", stdin);
//freopen("nums.out", "w", stdout);
ifstream f("nums.in");
ofstream g("numas.out");
int m=0;
//scanf("%d",&n);
f>>n;
for(logn=1;1<<(logn+1)<=n;logn++);
for(int i=1;i<=n;i++)
{
//scanf("%d",&v[i].tip);
f>>v[i].tip;
if(v[i].tip)
{
//char numar[100010];
//scanf("%s",numar);
//sir[++m]=numar;
f>>sir[++m];
t[sir[m].size()].insert(sir[m],i,m);
}
else /*scanf("%d",&v[i].x);*/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);
//printf("%s\n",sir[norm[x]].c_str());
g<<sir[norm[x]]<<"\n";
}
return 0;
}