Cod sursa(job #866398)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 27 ianuarie 2013 23:11:01
Problema Nums Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#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==1 && !viz[Query[i].val])
			Update(Query[i].val),viz[Query[i].val]=1;
		else
			out<<Query[V[BinarySearch(Query[i].val)]].s<<'\n';
		
		}
	
	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;
	
}