Pagini recente » Cod sursa (job #2017356) | Cod sursa (job #1760) | Cod sursa (job #1269079) | Cod sursa (job #1156976) | Cod sursa (job #306783)
Cod sursa(job #306783)
#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;
}