Pagini recente » Cod sursa (job #2610812) | Rating Lucian Rus (bananas04) | Cod sursa (job #749384) | Cod sursa (job #400596) | Cod sursa (job #632361)
Cod sursa(job #632361)
# include <algorithm>
# include <fstream>
# include <cstring>
# include <string>
# include <bitset>
using namespace std;
#define DN 100005
using namespace std;
string V[DN], P[DN];
pair <int, string> Q[DN];
int N, L, T, A[DN];
bitset <DN> U;
struct cmp
{
bool operator() (const string &a, const string &b) const
{
if(a.size() == b.size())
return a.compare(b) < 0;
return a.size() < b.size();
}
};
inline int lsb(int x)
{
return (x & -x);
}
inline void update(int poz)
{
for(; poz <= N; poz += lsb(poz))
++A[poz];
}
inline int sum(int poz)
{
int rez = 0;
for(; poz; poz -= lsb(poz))
rez += A[poz];
return rez;
}
int main()
{
ifstream f("nums.in");
ofstream g("nums.out");
f >> N;
char buf[DN];
f.getline (buf, DN);
for(int i = 1; i <= N; ++i)
{
f.getline(buf, DN);
//g << buf << "\n";
//int m = strlen(buf);
//if(buf[m-1] == '\n') buf[m-1] = 0;
string s = string(buf+2);
if(buf[0] == '1')
{
V[++L] = s;
Q[++T] = make_pair(1, s);
}
else
Q[++T] = make_pair(2, s);
}
sort(V+1, V+L+1, cmp());
P[N = 1] = V[1];
for(int i = 2; i <= L; ++i)
if(V[i] != P[N])
P[++N] = V[i];
for(int i = 1; i <= T; ++i)
{
int op = Q[i].first;
string s = Q[i].second;
if(op == 1)
{
int poz = lower_bound(P+1, P+N+1, s, cmp()) - P;
if(U[poz]) continue;
U[poz] = 1;
update(poz);
}
if(op == 2)
{
int k = 0;
for(size_t j = 0, kk = s.size (); j < kk; ++j)
k = k * 10 + s[j] - '0';
int lg = (1 << 17), i = 0;
for (lg = 1; lg << 1 <= N; lg <<= 1);
for(; lg; lg >>= 1)
if(i + lg <= N && sum(i + lg) < k)
i += lg;
g << P[i + 1] << "\n";//printf("%s\n", P[i+1].c_str());
}
}
}