Cod sursa(job #319936)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 2 iunie 2009 21:24:49
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <iostream>
#include <string>
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);
    }
int main(){
    freopen("nums.in","r",stdin);
    freopen("nums.out","w",stdout);
    int M,t,k;
    scanf("%d\n",&M);
    InitTreap();
    while (M--)
    {
          scanf("%d ",&t);
          if (t==1)
          {
            cin>>N;
            if (!Search(T)) add(T);
          }
          else
          {
            cin>>k;
            cout<<findkth(T,k)<<'\n';
          }
    }
    
    return 0;
}