Pagini recente » Cod sursa (job #1917956) | Cod sursa (job #321972) | Cod sursa (job #1339248) | Cod sursa (job #2959307) | Cod sursa (job #866408)
Cod sursa(job #866408)
#include <fstream>
#include <string>
#include <algorithm>
#define nmax 100100
#define lsb(x) (x&-x)
using namespace std;
struct query{bool tip;int val;string s;}Query[nmax];
int N,T,V[nmax],Aib[nmax];
bool viz[nmax];
int BinarySearch(int K) {
int i,step,Sum;
for(step=1;step<N;step<<=1);
for(i=0,Sum=0;step;step>>=1)
if(i+step<=N && Sum+Aib[i+step]<K)
Sum+=Aib[i+=step];
return i+1;
}
void Update(int Nod) {
for(;Nod<=N;Nod+=lsb(Nod))
Aib[Nod]++;
}
bool compare(int x,int y) {
if(Query[x].s.length()==Query[y].s.length())
return Query[x].s<Query[y].s;
else
return Query[x].s.length()<Query[y].s.length();
}
void normalize() {
sort(V+1,V+N+1,compare);
for(int i=1;i<=N;i++) {
if(Query[V[i]].s==Query[V[i-1]].s)
Query[V[i]].val=Query[V[i-1]].val;
else
Query[V[i]].val=i;
}
}
void solve() {
int i;
ofstream out("nums.out");
normalize();
for(i=1;i<=T;i++) {
if(Query[i].tip==0)
out<<Query[V[BinarySearch(Query[i].val)]].s<<'\n';
else
if(!viz[Query[i].val])
Update(Query[i].val),viz[Query[i].val]=1;
}
out.close();
}
void read() {
ifstream in("nums.in");
in>>T;
for(int i=1;i<=T;i++) {
in>>Query[i].tip;
if(Query[i].tip==0)
in>>Query[i].val;
else {
in>>Query[i].s;
V[++N]=i;
}
}
in.close();
}
int main() {
read();
solve();
return 0;
}