Pagini recente » Cod sursa (job #2660265) | Cod sursa (job #1475635) | Cod sursa (job #2831203) | Cod sursa (job #2596702) | Cod sursa (job #1317577)
#include <iostream>
#include <unordered_map>
#include <vector>
#include <set>
#include <string>
#include <algorithm>
using namespace std;
const int NMAX = 100002;
int op[NMAX], index[NMAX], ind[NMAX], lsb[NMAX], ok, sum;
string s[NMAX];
vector < int >v[NMAX];
unordered_map < string ,int > M;
struct cmp
{
bool operator ()(const int i,const int j)
{
return s[i] < s[j];
}
};
set < int,cmp >S[NMAX];
struct AINT{
vector <int > aint;
int n, Step;
AINT()
{
n = 0;
aint.clear();
}
AINT(const int _n)
{
n = _n;
aint.resize(4*n+1);
}
inline void Update(const int node,const int Left,const int Right,const int pos)
{
if(Left==Right)
{
++aint[node];
return ;
}
int mid = (Left+Right)/2;
if(pos<=mid)
Update(2*node,Left,mid,pos);
else
Update(2*node+1,mid+1,Right,pos);
aint[node] = aint[2*node]+aint[2*node+1];
}
inline int Query(const int node,const int Left,const int Right,const int S)
{
if(Left==Right)
return Left;
int mid = (Left+Right)/2;
if(aint[2*node] >= S)
return Query(2*node,Left,mid,S);
sum += aint[2*node];
return Query(2*node+1,mid+1,Right,S-aint[2*node]);
}
inline void Update(const int pos)
{
Update(1,1,n,pos);
}
inline int search(const int s)
{
return Query(1,1,n,s);
}
};
AINT V[NMAX];
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
cin.sync_with_stdio(false);
int n;
cin >> n;
for(int i=1;i<=100000;++i)
lsb[i] = i & -i;
AINT A = AINT(100000);
for(int i=1;i<=n;++i)
{
cin >> op[i];
if(op[i]==1){
cin >> s[i];
int L = s[i].length();
S[L].insert(i);
}
else
cin >> index[i];
}
for(int i=1;i<=100000;++i){
int j = 1;
for(auto x=S[i].begin();x!=S[i].end();++x,++j){
v[i].push_back(*x);
ind[*x] = j;
}
S[i].clear();
--j;
V[i] = AINT(j);
}
for(int i=1;i<=n;++i)
if(op[i]==1){
cin >> s[i];
int L = s[i].length();
if(M.find(s[i])!=M.end())
continue;
else
M[s[i]] = 1;
A.Update(L);
V[L].Update(ind[i]);
}
else{
int pos = index[i];
sum = 0;
int L = A.search(pos);
pos -= sum;
int sol = V[L].search(pos);
cout<<s[v[L][sol-1]]<<"\n";;
}
return 0;
}