Pagini recente » Cod sursa (job #2782604) | Cod sursa (job #2926572) | Cod sursa (job #317719) | Cod sursa (job #1280362) | Cod sursa (job #788919)
Cod sursa(job #788919)
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
struct Treap{
int NrNodes,priority;
string num;
Treap *left,*right;
Treap() {}
Treap(string S,int prt,Treap *L,Treap *R){
this->num=S;
this->priority=prt;
this->left=L;
this->right=R;
}
};
Treap *nil,*T;
int cmp(string A,string B){
if (A.length()<B.length()) return -1;
if (A.length()>B.length()) return 1;
if (A<B) return -1;
if (A>B) return 1;
return 0;
}
void InitTreap(){
srand(unsigned(time(0)));
T=nil=new Treap("0",-1,0,0);
nil->NrNodes=0;
}
string N;
int Search(Treap *T){
if (T==nil) return 0;
int r=cmp(T->num,N);
if (r==0) return 1;
if (r==1) return Search(T->left);
return Search(T->right);
}
void Update(Treap* &n){
n->NrNodes=1+ n->left->NrNodes + n->right->NrNodes;
}
void Rotleft(Treap* &n){
Treap *w=n->left;
n->left=w->right;
w->right=n;
n=w;
}
void Rotright(Treap* &n){
Treap *w=n->right;
n->right=w->left;
w->left=n;
n=w;
}
void add(Treap* &n){
if (n==nil)
{
n=new Treap(N,rand(),nil,nil),
n->NrNodes=1;
return;
}
else
if (cmp(n->num,N)==1)
add(n->left);
else
add(n->right);
if (n->left->priority > n->priority)
Rotleft(n),Update(n->right);
else
if (n->right->priority > n->priority)
Rotright(n),Update(n->left);
Update(n);
}
string findkth(Treap *n,int k){
int p=1 + n->left->NrNodes;
if (p==k) return n->num;
if (p<k) return findkth(n->right,k-p);
return findkth(n->left,k);
}
ifstream fin("nums.in");
ofstream fout("nums.out");
int main(){
int M,t,k;
fin>>M;
getline(fin,N);
InitTreap();
while (M--)
{
getline(fin,N);
t=N[0]-'0';
N.erase(0,2);
if (t==1)
{
if (!Search(T)) add(T);
}
else
{
k=0;
for (size_t i=0;i<N.length();++i) k=k*10+N[i]-'0';
fout<<findkth(T,k)<<'\n';
}
}
return 0;
}