Pagini recente » Cod sursa (job #2075544) | Cod sursa (job #787544) | Cod sursa (job #1601554) | Cod sursa (job #667780) | Cod sursa (job #578328)
Cod sursa(job #578328)
# include <fstream>
# include <iostream>
# include <algorithm>
# include <vector>
# define DIM 100003
# define pb push_back
using namespace std;
int n, o[DIM], w[DIM], p[DIM], b[DIM], a[4*DIM], s[DIM];
vector<char>V[DIM];
bool cmp (int i, int j)
{
if (V[i].size()<V[j].size())return 1;
if (V[i].size()>V[j].size())return 0;
if (V[i]<V[j])return 1;
return 0;
}
void read ()
{
ifstream fin ("nums.in");
fin>>n;
char c;
for(int i=1;i<=n;++i)
{
fin>>o[i];
if (o[i]==1)
{
p[++p[0]]=i;
fin.get();
while(fin.get(c) && c>='0' && c<='9')
V[i].pb(c);
}
else
fin>>w[i];
}
}
void upd(int k, int st,int dr, int p)
{
if (st==dr)
{
a[k]=1;
return;
}
int mij=(st+dr)/2;
if (p<=mij)upd(2*k, st, mij, p);
else upd(2*k+1, mij+1,dr, p);
a[k]=a[2*k]+a[2*k+1];
}
int query (int k, int st, int dr, int p)
{
if (st==dr)
return st;
int mij=(st+dr)/2;
if (p>a[2*k])return query(2*k+1, mij+1, dr, p-a[2*k]);
else return query(2*k, st, mij, p);
}
int egal (int i, int j)
{
if (V[i].size() != V[j].size())return 0;
if (V[i]<V[j] || V[j]<V[i])return 0;
return 1;
}
void solve ()
{
sort(p+1,p+p[0]+1, cmp);
w[p[1]]=1;
b[1]=p[1];
int q=1, bag=0;
for(int i=2;i<=p[0];++i)
{
if (!egal(p[i],p[i-1]))
++q, b[q]=p[i], bag=1;
else
bag=0;
if (bag)w[p[i]]=q;
else w[p[i]]=0;
}
for(int i=1;i<=n;++i)
if (o[i]==1)
{
if (w[i])
upd(1, 1, q, w[i]);
}
else
s[++s[0]]=b[query(1, 1, q, w[i])];
}
void write ()
{
freopen("nums.out", "w", stdout);
for(int i=1;i<=s[0];++i)
{
for(int j=0;j<V[s[i]].size();++j)
printf("%c",V[s[i]][j]);
printf("\n");
}
}
int main()
{
read ();
solve ();
write ();
return 0;
}