Pagini recente » Cod sursa (job #1064127) | Cod sursa (job #887016) | Cod sursa (job #710309) | Cod sursa (job #261901) | Cod sursa (job #479291)
Cod sursa(job #479291)
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
#define N_MAX 100002
char *a[N_MAX];
char c[N_MAX];
int n,i,j,t,k;
int N,nf;
int ind[N_MAX],lg[N_MAX],b[N_MAX];
int indf[N_MAX],Nf;
int intr[N_MAX],ut[N_MAX];
int aib[N_MAX];
inline int LSB(int i)
{
return i&(-i);
}
void update(int ind,int val)
{
for(int i=ind;i<=Nf;i+=LSB(i))
aib[i]+=val;
}
int query(int sum)
{
int i,step;
for(step=1;step<Nf;step<<=1);
for(i=0;step;step>>=1)
if(i+step<=Nf&&aib[i+step]<=sum)
{
i+=step;
sum-=aib[i];
if(!sum)
return i;
}
return -1;
}
struct cmp
{
bool operator () (const int &i,const int &j) const
{
return lg[i]<lg[j];
}
};
void bsort(int st,int dr,int poz)
{
int cifra[10],index[10],i,id;
memset(cifra,0,sizeof(cifra));
memset(index,0,sizeof(index));
for(i=st;i<=dr;i++)
{
id=ind[i];
cifra[a[id][poz]-'0']++;
}
index[0]=1;
for(i=1;i<=9;i++)
{
index[i]=index[i-1]+cifra[i-1];
}
for(i=st;i<=dr;i++)
{
id=ind[i];
b[st-1+index[a[id][poz]-'0']++]=id;
}
for(i=st;i<=dr;i++)
ind[i]=b[i];
}
void radixsort(int st,int dr,int lg)
{
for(int i=lg-1;i>=0;i--)
{
bsort(st,dr,i);
}
}
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&t);
if(t)
{
scanf("%s",c);
j=strlen(c);
lg[++N]=j;
a[N]=new char [j];
strcpy(a[N],c);
}
else
{
scanf("%d",&k);
intr[i]=k;
}
}
for(i=1;i<=N;i++)
ind[i]=i;
sort(ind+1,ind+N+1,cmp());
for(i=1;i<=N;)
{
for(j=i;j<=N;j++)
if(lg[ind[i]]!=lg[ind[j]])
break;
j--;
radixsort(i,j,lg[ind[j]]);
i=j+1;
}
for(i=1;i<=N;)
{
for(j=i;j<=N;j++)
if(strcmp(a[ind[i]],a[ind[j]])!=0)
break;
indf[++Nf]=ind[i];
i=j;
}
for(i=1;i<=Nf;i++)
ut[indf[i]]=i;
return 0;
for(i=1;i<=n;i++)
{
nf+=intr[i]==0;
if(intr[i])
{
j=query(intr[i]);
printf("%s\n",a[indf[j]]);
}
else
{
if(ut[nf]==0)
continue;
update(ut[nf],1);
}
}
return 0;
}