Cod sursa(job #788919)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 16 septembrie 2012 09:57:56
Problema Nums Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#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;
}