Pagini recente » Cod sursa (job #1073421) | Cod sursa (job #13442) | Cod sursa (job #2720270) | Cod sursa (job #2369162) | Cod sursa (job #578252)
Cod sursa(job #578252)
# include <fstream>
# include <iostream>
# include <cstring>
# include <algorithm>
# include <vector>
# define DIM 100003
# define pb push_back
using namespace std;
int n, o[DIM], w[DIM], p[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];
}
sort(p+1,p+p[0]+1, cmp);
for(int i=1;i<=p[0];++i)
w[p[i]]=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);
}
void solve ()
{
for(int i=1;i<=n;++i)
if (o[i]==1)
upd(1, 1, p[0], w[i]);
else
s[++s[0]]=query(1, 1, p[0], w[i]);
}
void write ()
{
freopen("nums.out", "w", stdout);
for(int i=1;i<=s[0];++i)
{
for(int j=0;j<V[p[s[i]]].size();++j)
printf("%c",V[p[s[i]]][j]);
printf("\n");
}
}
int main()
{
read ();
solve ();
write ();
return 0;
}