Cod sursa(job #912599)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 12 martie 2013 16:29:41
Problema Nums Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<assert.h>
using namespace std;

#define NMAX 100001

struct entry {
	int opt;
	string s;
};

entry v[NMAX],a[NMAX],b[NMAX];
int arb[4*NMAX+1],poz,sol,l;

inline int compare(string a, string b)
{
	int n,m;
	n=a.size()-1;
	m=b.size()-1;
	if(n<m)
		return -1;
	else if(n>m)
		return 1;
	else {
		int i;
		for(i=0;i<=n;i++)
			if(a[i]<b[i])
				return -1;
			else if(a[i]>b[i])
				return 1;
		return 0;
	}
}

inline bool cmp(const entry &a, const entry &b)
{
	return (compare(a.s,b.s)<=0);
}

inline bool cmp2(const entry &a, const entry &b)
{
	return (a.opt<=b.opt);
}

inline void stand(int n)
{
	int i,c;
	l=0;
	for(i=1;i<=n;i++)
		if(v[i].opt==1)
			a[++l]=v[i];
	sort(a+1,a+l+1,cmp);
	c=0;
	for(i=1;i<=l;i++) {
		if(a[i].s.compare(a[i-1].s)!=0)
			c++;
		a[i].opt=c;
	}
	for(i=1;i<=l;i++)
		b[i]=a[i];
	sort(b+1,b+l+1,cmp2);
}

inline int cbin1(int p, int q, string x)
{
	int mij,d;
	while(p<=q) {
		mij=(p+q)/2;
		d=compare(x,a[mij].s);
		if(d<0)
			q=mij-1;
		else if(d>0)
			p=mij+1;
		else return a[mij].opt;
	}
	return 0;
}

inline int cbin2(int p, int q, int x)
{
	int mij;
	while(p<=q) {
		mij=(p+q)/2;
		if(x<b[mij].opt)
			q=mij-1;
		else if(x>b[mij].opt)
			p=mij+1;
		else return mij;
	}
	return 0;
}

inline void update(int nod, int st, int dr)
{
	int mij;
	if(st==dr) {
		arb[nod]=1;
		return ;
	}
	mij=(st+dr)/2;
	if(poz<=mij)
		update(nod*2,st,mij);
	else update(nod*2+1,mij+1,dr);
	arb[nod]=arb[2*nod]+arb[2*nod+1];
}

inline void query(int nod, int st, int dr)
{
	int mij;
	if(st==dr) {
		sol=st;
		return ;
	}
	mij=(st+dr)/2;
	if(poz<=arb[nod*2]) 
		query(nod*2,st,mij);
	else {
		poz=poz-arb[2*nod];
		query(2*nod+1,mij+1,dr);
	}
}

inline int numar(string x)
{
	int nr,i,n;
	n=x.size()-1;
	nr=0;
	for(i=0;i<=n;i++)
		nr=nr*10+x[i]-48;
	return nr;
}

int main ()
{
	int n,i;
	ifstream f("nums.in");
	ofstream g("nums.out");
	f>>n;
	for(i=1;i<=n;i++) 
		f>>v[i].opt>>v[i].s;
	f.close();
	stand(n);
	for(i=1;i<=n;i++) {
		if(v[i].opt==1) {
			poz=cbin1(1,l,v[i].s);
			assert(poz>=1 && poz<=l);
			update(1,1,l);
		}
		else {
			poz=numar(v[i].s);
			query(1,1,l);
			assert(sol>=1 && sol<=l);
			g<<b[cbin2(1,l,sol)].s<<'\n';
		}
	}
	g.close();
	return 0;
}