Pagini recente » Cod sursa (job #1520724) | Cod sursa (job #2261943) | Cod sursa (job #1696158) | Cod sursa (job #424466) | Cod sursa (job #1687925)
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_set>
#define tractoree pair< string,int >
#define F first
#define S second
using namespace std;
ifstream f("nums.in");
ofstream g("nums.out");
const int N = (1e5)+5;
int i, t[N], n, ord[N], aib[N];
vector< tractoree > a;
string A;
bool cmp(tractoree a,tractoree b)
{
if(a.F.size()!=b.F.size()) return (a.F.size()<b.F.size());
int x=a.F.compare(b.F);
if(x==0) return (a.S<b.S);
return (x<0?1:0);
}
inline void update(int x)
{
for(; x<=a.size(); x+=(x&(-x))) ++aib[x];
}
inline int query(int x)
{
int ans=0;
for(; x; x-=(x&(-x))) ans+=aib[x];
return ans;
}
void bs(int p)
{
int st=1,dr=a.size(),mij;
while(st<=dr)
{
mij=((st+dr)>>1);
if(query(mij)<p) st=mij+1;
else dr=mij-1;
}
g<<a[dr].F<<'\n';
}
int main()
{
f>>n;
for(i=1; i<=n; ++i)
{
f>>t[i];
if(t[i])
{
f>>A;
t[i]=0;
a.push_back({A,i});
}
else f>>t[i];
}
sort(a.begin(), a.end(), cmp);
for(i=0; i<a.size(); ++i)
if(i && a[i].F==a[i-1].F) ord[a[i].S]=0;
else ord[a[i].S]=i+1;
for(i=1; i<=n; ++i)
if(t[i]) bs(t[i]);
else
if(ord[i]) update(ord[i]);
return 0;
}