Cod sursa(job #306783)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 21 aprilie 2009 22:29:49
Problema Nums Scor Ascuns
Compilator cpp Status done
Runda Marime 1.91 kb
#include <cstdio>
#include <string>
#include <fstream>
#define oo 0x3f3f3f3f

using namespace std;


struct nod
{
    string v;
    int nr;
    int p;
    nod *l, *r;
};

inline int cmp(string &a, string &b)
// ret 1 daca a < b
// ret -1 daca a > b
// ret 0 daca a = b
{
    if(a.size() < b.size() ) return 1;
    if(a.size() > b.size() ) return -1;
    
    for(int i=0; i < a.size(); ++i)
	if(a[i] == b[i]) ;
	else if(a[i] < b[i]) return 1;
	else return -1;

    return 0;

}

typedef nod* treap;

treap R, nil;

void init()
{
    nil=new nod;
    nil->l=nil->r=0;
    nil->v="";
    nil->p=-oo;
    nil->nr=0;
    R=nil;
}

inline void getnr(treap &n)
{
    if(n == nil) return;

    n->nr=1 + n->l->nr + n->r->nr;
}

inline void rotleft(treap &n)
{
    treap t=n->l;
    n->l=t->r;
    t->r=n;
    getnr(n); getnr(t);
    n=t;
}

inline void rotright(treap &n)
{
    treap t=n->r;
    n->r=t->l;
    t->l=n;
    getnr(n); getnr(t);
    n=t;
}


inline void insert(treap &n, string a)
{
    if(n == nil) 
    {
	n=new nod;
	n->l=n->r=nil;
	n->v=a;
	n->p=rand();
	n->nr=1;
	return ;
    }

    if(cmp(a, n->v) == 1) 
    // a < n->v
    {
	insert(n->l, a);
	if(n->l->p > n->p) rotleft(n);

    }

    if(cmp(a, n->v) == -1)
    // a > n->v
    {
	insert(n->r, a);
	if(n->r->p > n->p) rotright(n);
    }

    getnr(n);

}

inline string& findk(treap n, int k)
{
    if(n == nil) return (string&) "";
    if(n->l->nr + 1 == k) return n->v;
    if(n->l->nr + 1 > k) return findk(n->l, k);
    if(n->l->nr + 1 < k) return findk(n->r, k-(n->l->nr + 1));

    return (string &)"";
}
    
    

int main()
{
    init();
    ifstream f("nums.in");
    ofstream g("nums.out");
    int n, type, k;
    f>>n;

    string a;
    while(n--)
    {
	f>>type;
	//scanf("%d ", &type);
	
	if(type == 1)
	{
	  //  scanf("%s\n", &a);
	    f>>a;
	    
	    insert(R, a);
	    a.clear();
	}

	if(type == 0)
	{
	    f>>k;

	    g<<findk(R, k)<<"\n";
	}

    }

    return 0;
}