Pagini recente » Cod sursa (job #1639686) | Cod sursa (job #106025) | Cod sursa (job #2100985) | Cod sursa (job #1891372) | Cod sursa (job #1737346)
#include <bits/stdc++.h>
using namespace std;
bool comp(pair<string,int> a, pair<string,int> b)
{
if (a.first.size() == b.first.size())
return a.first < b.first;
return a.first.size() < b.first.size();
}
bool eq(pair<string,int> a, pair<string,int> b)
{
if (a.first.size() == b.first.size())
return a.first == b.first;
return 0;
}
int N,M;
int data[100001];
int do_at[100001];
int _norm[100001];
string snorm[100001];
vector< pair<string,int> > b;
void Add(int pos)
{
for (int i = pos; i <= M; i += i&-i)
data[i]++;
}
int kth_elem(int k)
{
int step,i;
for (step = 1; (step<<1) <= M; step <<= 1);
for (i = 0; step; step >>= 1)
if (step + i <= M && data[step+i] < k)
i += step, k -= data[i];
return i + 1;
}
int main()
{
ifstream fin("nums.in");
ofstream fout("nums.out");
fin >> N;
for (int i = 1; i <= N; i++)
{
int t;
fin >> t;
if (t == 0) // query
{
int x;
fin >> x;
do_at[i] = x;
}
else // update
{
do_at[i] = -1;
string s;
fin >> s;
b.push_back(make_pair(s,i));
}
}
stable_sort(b.begin(),b.end(),comp);
M = unique(b.begin(),b.end(),eq) - b.begin();
for (int i = 0; i < M; i++)
{
_norm[b[i].second] = i + 1;
do_at[b[i].second] = -2;
snorm[i+1] = b[i].first;
}
for (int i = 1; i <= N; i++)
{
if (do_at[i] == -1) continue;
if (do_at[i] > 0) // query
{
fout << snorm[kth_elem(do_at[i])] << "\n";
}
else // update
{
Add(_norm[i]);
}
}
}