Pagini recente » Cod sursa (job #1584028) | Istoria paginii runda/preoni_nicu3/clasament | Monitorul de evaluare | Cod sursa (job #498949) | Cod sursa (job #479953)
Cod sursa(job #479953)
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
#define N_MAX 100002
string a[N_MAX];
char c[N_MAX];
int n,i,j,t,k;
int N,nf,Nf;
int intr[N_MAX];
int IND[N_MAX],poz[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 i+1;
return -1;
}
struct cmp
{
bool operator () (string a,string b) const
{
int la=a.size();
int lb=b.size();
return la<lb||la==lb&&a.compare(b)<0;
}
};
struct cmp2
{
bool operator () (int i,int j) const
{
int la=a[i].size();
int lb=a[j].size();
return la<lb||la==lb&&a[i].compare(a[j])<0;
}
};
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);
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,cmp2());
for(i=1;i<=N;)
{
int Min=1<<15;
for(j=i;j<=N;j++)
{
if(a[IND[i]]!=a[IND[j]])
break;
Min=min(Min,IND[j]);
}
IND[++Nf]=Min;
poz[Min]=i;
i=j;
}
for(i=1;i<=n;i++)
{
nf+=intr[i]==0;
if(intr[i])
{
j=query(intr[i]);
printf("%s\n",a[IND[j]].c_str());
}
else
{
if(poz[nf]==0)
continue;
update(poz[nf],1);
}
}
return 0;
}