Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/mariaz | Cod sursa (job #1635314) | Monitorul de evaluare | Cod sursa (job #389976)
Cod sursa(job #389976)
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const char iname[]="nums.in";
const char oname[]="nums.out";
const int maxn=100005;
char s[maxn];
struct trie
{
string s;
int v;
} a[maxn];
bool operator<(const trie& a,const trie& b)
{
if(a.s.length()==b.s.length())
return a.s.compare(b.s)<0;
return a.s.length()<b.s.length();
}
int n,i,j,k,aib[maxn],r;
pair<int,int> Q[maxn];
void update(int x)
{
int s=0,i;
for(i=x;i;i-=i&-i)
s+=aib[i];
for(i=x-1;i;i-=i&-i)
s-=aib[i];
if(s==1)
return;
for(i=x;i<=k;i+=i&-i)
++aib[i];
}
int query(int x)
{
int i,step;
for(step=1;step<=k;step<<=1);
for(i=0;step;step>>=1)
if(i+step<=k&&aib[i+step]<=x)
x-=aib[i+step],i+=step;
return i;
}
int main()
{
freopen(iname,"r",stdin);
freopen(oname,"w",stdout);
scanf("%d\n",&n);
for(i=1;i<=n;++i)
{
fgets(s,sizeof(s),stdin);
if(s[strlen(s)-1]=='\n')
s[strlen(s)-1]=0;
if(s[0]=='1')
a[++r].s=(s+2),a[r].v=i;
else
Q[i].first=0,sscanf(s+2,"%d",&Q[i].second);
}
sort(a+1,a+r+1);
for(i=1;i<=r;Q[a[i].v].first=1,Q[a[i].v].second=k,++i)
if(a[i].s.length()!=a[i-1].s.length()||a[i].s.compare(a[i-1].s)!=0)
a[++k].s=a[i].s;
/*for(i=1;i<=k;++i)
printf("%s\n",a[i].s.c_str());
printf("\n");*/
for(i=1;i<=n;++i)
if(Q[i].first==1)
update(Q[i].second);
else
printf("%s\n",a[query(Q[i].second)].s.c_str());
fclose(stdin);
fclose(stdout);
return 0;
}