Pagini recente » Cod sursa (job #1386703) | Cod sursa (job #2556239) | Cod sursa (job #1710936) | Cod sursa (job #1582083) | Cod sursa (job #1317568)
#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];
string s[NMAX];
unordered_map < string,int >M;
int v[NMAX];
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);
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);
}
};
int main()
{
freopen("nums.in","r",stdin);
freopen("nums.out","w",stdout);
cin.sync_with_stdio(false);
int n;
cin >> n;
AINT A(NMAX);
for(int i=1;i<=n;++i)
{
cin >> op[i];
if(op[i]==1){
cin >> s[i];
int L = s[i].length();
if(S[L].find(i)!=S[L].end())
continue;
S[L].insert(i);
}
else
cin >> index[i];
}
int j = 0;
for(int i=1;i<=100000;++i){
for(auto x=S[i].begin();x!=S[i].end();++x){
v[++j] = *x;
ind[*x] = j;
}
S[i].clear();
}
for(int i=1;i<=n;++i)
if(op[i]==1){
cin >> s[i];
int L = s[i].length();
if(S[L].find(i)!=S[L].end())
continue;
A.Update(ind[i]);
}
else{
int L = A.search(index[i]);
cout<<s[v[L]]<<"\n";
}
return 0;
}