Pagini recente » Cod sursa (job #450268) | Cod sursa (job #1890078) | Cod sursa (job #272751) | Cod sursa (job #2444378) | Cod sursa (job #319318)
Cod sursa(job #319318)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<bitset>
using namespace std;
#define N 100010
char *a[N];
int lg[N],op[N],ref[N],n,num[N],nr,nmax,arb[N],cine[N];
bitset<N> viz;
bool compar(const int &x,const int &y)
{
if(lg[x]<lg[y])
return true;
if(lg[x]>lg[y])
return false;
for(int i=0; i<lg[x]; ++i)
{
if(a[x][i]!=a[y][i])
{
if(a[x][i]<a[y][i])
return true;
return false;
}
}
return false;
}
inline bool lafel(int x,int y)
{
if(lg[x]!=lg[y])
return false;
for(int i=0; i<lg[x]; ++i)
{
if(a[x][i]!=a[y][i])
return false;
}
return true;
}
inline void normalizare()
{
char c[N];
int cate=0;
scanf("%d\n",&n);
for(int i=1; i<=n; ++i)
{
fgets(c,N,stdin);
if(c[0]=='0')
{
int x=0;
for(int j=2; c[j]>='0' && c[j]<='9'; ++j)
x=x*10+c[j]-'0';
op[i]=x;
continue;
}
int j=2;
for(; c[j]>='0' && c[j]<='9'; ++j)
;
--j,--j;
++cate;
ref[cate]=cate;
lg[cate]=j;
a[cate]=new char[j+2];
a[cate][j]='\0';
memcpy(a[cate],c+2,j);
}
sort(ref+1,ref+cate+1,compar);
nr=1;
num[ref[1]]=1;
cine[1]=ref[1];
for(int i=2; i<=cate; ++i)
{
if(lafel(ref[i-1],ref[i]))
{
num[ref[i]]=nr;
continue;
}
num[ref[i]]=++nr;
cine[nr]=ref[i];
}
/*for(int i=1; i<=cate; ++i)
{
fputs(a[i],stderr);
fprintf(stderr," %d %d\n",num[i],ref[i]);
}*/
}
inline int nrb(int x)
{
return ((x&(x-1))^x);
}
inline void adauga(int poz)
{
for(; poz<=nr; poz+=nrb(poz))
++arb[poz];
}
inline int suma(int poz)
{
int s=0;
for(; poz; poz-=nrb(poz))
s+=arb[poz];
return s;
}
inline int find(int x)
{
int p=1,u=nr;
while(p<u)
{
int m=(p+u)>>1;
if(x<=suma(m))
u=m;
else
p=m+1;
}
return p;
}
inline void rezolva()
{
//fprintf(stderr,"%d\n",n);
for(int i=1,j=0; i<=n; ++i)
{
if(op[i])
{
fputs(a[cine[find(op[i])]],stdout);
fputc('\n',stdout);
continue;
}
++j;
//fprintf(stderr,"%d ",j);
if(viz[num[j]])
continue;
viz[num[j]]=1;
//fprintf(stderr,"%d\n",num[j]);
adauga(num[j]);
}
}
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
normalizare();
rezolva();
return 0;
}