Pagini recente » Cod sursa (job #1504736) | Istoria paginii runda/qwdqfqw | Cod sursa (job #1498724) | Cod sursa (job #2105420) | Cod sursa (job #809814)
Cod sursa(job #809814)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("nums.in");
#define LE 106000
ofstream g("nums.out");
string S[LE];
int tip[LE],Q[LE],pos[LE],L[LE];
int i,n;
int ind[LE];
int Arb[LE*6];
int n2;
int comp(int A,int B)
{
if (L[A]<L[B])
return true;
if (L[A]>L[B])
return false;
int N=L[A];
for(i=0; i<N; ++i)
{
if (S[A][i]<S[B][i])
return true;
if (S[A][i]>S[B][i])
return false;
}
return false;
}
void update(int st,int dr,int value,int nod)
{
int mij=(st+dr)/2;
++Arb[nod];
if (st==dr)
return ;
if (value<=mij)
update(st,mij,value,nod*2);
else update(mij+1,dr,value,nod*2+1);
}
int query(int st,int dr,int nod,int DR)
{
int mij=(st+dr)/2;
if (dr<=DR)
return Arb[nod];
if (mij+1>DR)
return query(st,mij,nod*2,DR);
return query(st,mij,nod*2,DR)+query(mij+1,dr,nod*2+1,DR);
}
int BS(int value)
{
int step,pos;
for(step=1; step<=n2; step*=2);
for(pos=0; step; step/=2)
if (pos+step<=n2&&query(1,n2,1,pos+step)<value)
pos+=step;
return pos+1;
}
int main()
{
f>>n;
int k=0;
for(i=1; i<=n; ++i)
{
f>>tip[i];
if (tip[i]==0)
f>>Q[i];
if (tip[i]==1)
{
f>>S[++k];
L[k]=S[k].length();
Q[i]=k;
}
}
n2=k;
for(i=1; i<=n2; ++i)
ind[i]=i;
sort(ind+1,ind+n2+1,comp);
for(i=1; i<=n2; ++i)
pos[ind[i]]=i;
for(i=1; i<=n; ++i)
{
if (tip[i]==1)
update(1,n2,pos[Q[i]],1);
if (tip[i]==0)
{
int p=ind[BS(Q[i])];
int N=S[p].length();
for(int j=0; j<N; ++j)
g<<S[p][j];
g<<'\n';
}
}
f.close();
g.close();
return 0;
}