Cod sursa(job #912604)

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

#define NMAX 100001

struct entry {
	int opt,poz;
	string s;
};

entry v[NMAX],a[NMAX];
string rez[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];
			a[l].poz=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++)
		v[a[i].poz].poz=a[i].opt;
	for(i=1;i<=l;i++)
		if(a[i].opt!=a[i-1].opt)
			rez[a[i].opt]=a[i].s;
}

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=v[i].poz;
			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<<rez[sol]<<'\n';
		}
	}
	g.close();
	return 0;
}