Pagini recente » Cod sursa (job #879248) | Cod sursa (job #1610586) | Cod sursa (job #2157253) | Cod sursa (job #461547) | Cod sursa (job #1679662)
#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;
unordered_set<string> Set;
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<b.F);
return (a.F.size()<b.F.size());
}
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;
if(Set.find(A)==Set.end())
{
a.push_back({A,i});
Set.insert(A);
}
}
else f>>t[i];
}
sort(a.begin(), a.end(), cmp);
for(i=0; i<a.size(); ++i)
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;
}