Cod sursa(job #405235)

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

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];
char t[MAX_N], *s[MAX_N];
int N, i, j, op, cnt, len, bnd, k, c, cnz;
int ct[MAX_N], *nums[MAX_N], aux[MAX_N], zero[MAX_N], zk[MAX_N];
    
     int cmp(int A, int B)
     {
         if (strcmp(s[A], s[B]) < 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 (A[Nod << 1] >= K) 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);
         
         cnt = 0; cnz = 0;
         for (i = 1; i <= N; ++i)
         {
             scanf("%d ", &op);
             
             if (op == 1)
             {
                 gets(t);
                 ++ct[len = strlen(t)];
                 bnd = max(bnd, len);
                 s[++cnt] = (char *) malloc(len + 1);
                 for (j = 0; j <= len; ++j) s[cnt][j] = t[j];
             } else 
             {
                 scanf("%d", &zk[++cnz]);
                 zero[cnz] = cnt;
             }
         }
         
         for (i = 1; i <= bnd; ++i) nums[i] = (int *) malloc((ct[i] + 1) * sizeof(int)), nums[i][0] = 0;
         for (i = 1; i <= cnt; ++i)
         {
             len = strlen(s[i]);
             nums[len][++nums[len][0]] = i;
         }
         
         for (i = 1; i <= bnd; ++i)
            if (ct[i]) sort(nums[i] + 1, nums[i] + nums[i][0] + 1, cmp);
            
         int dnt = 0;
         for (i = 1; i <= bnd; ++i)
            if (ct[i])
            {
                aux[nums[i][1]] = ++dnt;
                for (j = 2; j <= nums[i][0]; ++j)
                {
                    for (k = 0; k < i; ++k)
                       if (s[nums[i][j]][k] != s[nums[i][j - 1]][k]) break;
                    if (k != i) aux[nums[i][j]] = ++dnt;
                    else aux[nums[i][j]] = dnt;
                }
            }
         for (i = 1; i <= cnt; ++i) ct[aux[i]] = i;
         
         c = 0;
         for (i = 1; i <= cnz; ++i)
         {
             while (c != zero[i]) update(1, 1, dnt, aux[++c]);
             printf("%s\n", s[ct[query(1, 1, dnt, zk[i])]]);
         }
         
         /*for (i = 1; i <= dnt; ++i)
            printf("%s\n", s[ct[i]]);*/
         //for (i = 1; i <= cnt; ++i) printf("%s\n", s[i]);*/
         
         return 0;
     }