Pagini recente » Cod sursa (job #630443) | Cod sursa (job #3242296) | Cod sursa (job #2051051) | Cod sursa (job #978122) | Cod sursa (job #594122)
Cod sursa(job #594122)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#define NMAX 100005
#define INF 1000005
using namespace std;
int n,poz,r,nr,tip,ord[NMAX],t,C[NMAX],aib[NMAX],act,poz_a;
vector <char> A[NMAX];
char line[NMAX];
struct query
{
int a,b;
};
query B[NMAX];
inline int cif(char x)
{
return x>='0' && x<='9';
}
bool comp(int x,int y)
{
if (A[x].size()<A[y].size())
return 1;
if (A[x].size()>A[y].size())
return 0;
int i;
for (i=0; i<A[x].size(); i++)
{
if (A[x][i]<A[y][i])
return 1;
if (A[x][i]>A[y][i])
return 0;
}
if (x<y)
return 1;
return 0;
}
int lsb(int x)
{
return x & -x;
}
void update(int poz,int val)
{
int i;
for (i=poz; i<=r; i+=lsb(i))
aib[i]+=val;
}
int suma(int x)
{
int i,s=0;
for (i=x; i>=1; i-=lsb(i))
s+=aib[i];
return s;
}
int cbin(int val)
{
int i,step=(1<<17);
for (i=0; step; step>>=1)
if (i+step<=r && suma(i+step)<val)
i+=step;
return ++i;
}
int dif(int x,int y)
{
if (A[x].size()!=A[y].size())
return 1;
int i;
for (i=0; i<A[x].size(); i++)
if (A[x][i]!=A[y][i])
return 1;
return 0;
}
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
scanf("%d\n",&n);
int i,j,st;
while (n)
{
scanf("%d",&tip);
if (tip)
{
fgets(line+1,NMAX,stdin);
poz=0;
while (!cif(line[poz+1]))
poz++;
st=poz+1;
while (cif(line[poz+1]))
poz++;
r++;
ord[r]=r;
for (i=st; i<=poz; i++)
A[r].push_back(line[i]);
}
if (!tip)
{
scanf("%d\n",&nr);
B[++t].a=nr; B[t].b=r;
}
n--;
}
sort(ord+1,ord+r+1,comp);
for (i=1; i<=r; i++)
{
if (i==1)
{
C[ord[i]]=i;
continue ;
}
if (dif(ord[i],ord[i-1]) )
C[ord[i]]=i;
else
C[ord[i]]=INF;
}
for (i=1; i<=r; i++)
{
if (C[i]!=INF)
update(C[i],1);
while (B[act+1].b==i)
{
act++;
poz_a=cbin(B[act].a);
for (j=0; j<A[ord[poz_a]].size(); j++)
printf("%c",A[ord[poz_a]][j]);
printf("\n");
}
}
return 0;
}