Cod sursa(job #345372)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 2 septembrie 2009 19:11:35
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.14 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
int A[100005];
int S[100005];
int sir[100005];
int i;
int maxim;
int value;
int n;
int from[100005];
char charsir[1110000];
int Arb[263000];
int nr;
int subsir[10000];
int contor;
int best[100005];
int start;
int afis;
int fin;
int inline Maxim(int a, int b)
{
    if (a > b) return a;
    return b;
}
void Update(int nod, int st, int dr)
{
    if (st == dr)
     {
         Arb[nod] = value;
     }
     else
     {
     int mij = (st + dr) / 2;
     if (fin + 1 <= mij) Update(2 * nod, st, mij);
                    else  Update(2 * nod + 1, mij + 1, dr);
     Arb[nod] = Maxim(Arb[2 * nod],Arb[2 * nod + 1]);
     }

}
void Query(int nod, int st, int dr)
{
    if (start <= st && dr <= fin)
     {
         maxim = Maxim(maxim,Arb[nod]);
     }
     else
     {
     int mij = (st + dr) / 2;
     if (start <= mij ) Query(2 * nod, st, mij );
     if (fin > mij) Query(2 * nod + 1, mij  + 1, dr);
     }


}
int BinSearch(int val)
{
    int st = 1;
    int dr = sir[0];

    while (st <= dr)
     {
         if (val < sir[(st+dr)/2])
          dr = (st + dr) / 2 -1;
          else
            if (val > sir[(st + dr)/2])
             st = (st + dr) / 2 + 1;
              else
               if (val == sir[(st + dr)/2])
                return (st + dr) / 2;
     }

}
int Parse()
{
    int i = 0;
    while (charsir[i] != '\n')
     {
         if (charsir[i] != ' ') nr = nr * 10 + charsir[i] - '0';
                        else
                         {
                             contor++;
                             A[contor] = nr;
                             nr = 0;
                         }
         i++;
     }
     A[++contor] = nr;
     nr = 0;

}

int main()
{
        freopen("scmax.in","r",stdin);
        freopen("scmax.out","w",stdout);

        scanf("%d\n",&n);
        fgets(charsir, n * 11, stdin);
        Parse();
        memcpy(S,A,sizeof(A));
        sort(S + 1, S + n + 1);
        i = 1;
        while (i <= n)
         {
             if (S[i] != S[i+1])
              sir[++sir[0]] = S[i];
            i++;
         }
         for(int i = 1; i <= n; i++)
         {
             A[i] = BinSearch(A[i]);
         }
         for(int i = 1; i <= n; i++)
          {
              start = 1;
              fin = A[i] - 1;
              maxim = 0;
              if (fin > 0)
               {
                 Query(1,1,sir[0]);
               }
              best[i] = maxim + 1;
              value = best[i];
              Update(1,1,sir[0]);
          }
         for(int i = 1; i <= n; i++)
          if (afis < best[i]) afis = best[i];
         printf("%d\n",afis);

         for(int i = 1; i <= n; i++)
          if (afis == best[i])
           {
               while (afis)
                {
                    subsir[++subsir[0]] = sir[A[i]];
                    afis--;
                    while (best[i] != afis) i--;
                }
               break;
           }
        for(int i = subsir[0]; i > 0; i--)
         printf("%d ",subsir[i]);



    return 0;
}