Cod sursa(job #405273)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 27 februarie 2010 20:38:10
Problema Nums Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
# include <cstdio>
# include <vector>
# include <algorithm>
# include <string.h>
# include <stdlib.h>

using namespace std;

# define FIN "nums.in"
# define FOUT "nums.out"
# define max(a, b) ((a) > (b) ? (a) : (b))
# define MAX_N 100005

int A[MAX_N << 1];
int p[MAX_N], c[MAX_N];
vector <int> nums[MAX_N];
char t[MAX_N], *s[MAX_N];
int N, i, op, cnt, l, bnd, dst, prev, k;

     int cmp(int A, int B)
     {
          int vl = strcmp(s[A], s[B]);
          
          if (!vl) return A < B;
          else if (vl < 0) return 1;
          return 0;
     }
     
     void update(int Nod, int St, int Dr, int Pz)
     {
          if (St == Dr) {A[Nod] = 1; return; }
          
          int Mij = (St + Dr) >> 1;
          
          if (Pz <= Mij) update(Nod << 1, St, Mij, Pz);
          else update(Nod << 1 | 1, Mij + 1, Dr, Pz);
          
          A[Nod] = A[Nod << 1] + A[Nod << 1 | 1];
     }
     
     int query(int Nod, int St, int Dr, int k)
     {
         if (St == Dr) return St;
         
         int Mij = (St + Dr) >> 1;
         
         if (k <= A[Nod << 1]) return query(Nod << 1, St, Mij, k);
         else return query(Nod << 1 | 1, Mij + 1, Dr, k - A[Nod << 1]);
     }

     int main()
     {
         freopen(FIN, "r", stdin);
         freopen(FOUT, "w", stdout);
         
         scanf("%d", &N);
         for (i = 1; i <= N; ++i)
         {
             scanf("%d ", &op); gets(t);
             
             if (op)
             {
                  bnd = max(bnd, l = strlen(t));
                  s[++cnt] = (char*) malloc(l + 1);
                  strcpy(s[cnt], t);
                  nums[l].push_back(cnt);
             }
         }
         
         for (i = 1; i <= bnd; ++i)
            if (nums[i].begin() != nums[i].end())
            {
                 sort(nums[i].begin(), nums[i].end(), cmp);
            
                 vector <int> :: iterator it;
                 p[prev = *nums[i].begin()] = ++dst;
                 c[dst] = prev;
                 for (it = nums[i].begin() + 1; it != nums[i].end(); ++it)
                 {
                     if (strcmp(s[prev], s[*it]) == 0) p[*it] = dst;
                     else p[*it] = ++dst;
                     c[dst] = *it;
                     prev = *it;
                 }
            }
            
         freopen(FIN, "r", stdin);
         
         scanf("%d", &N);
         for (i = 1, cnt = 0; i <= N; ++i)
         {
             scanf("%d ", &op);
             
             if (op)
             {
                  gets(t);
                  update(1, 1, dst, p[++cnt]);
             } else
             {
                  scanf("%d", &k);
                  printf("%s\n", s[c[query(1, 1, dst, k)]]);
             }
         }
         
         return 0;
     }