Cod sursa(job #345366)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 2 septembrie 2009 18:21:53
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 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 Arb[263000];
int best[100005];
int start;
int afis;
int fin;
int 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
     {
     if (fin + 1 <= (st + dr) / 2) Update(2 * nod, st, (st + dr)/2);
                             else  Update(2 * nod + 1, (st + dr) / 2 + 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)
     {
         if (maxim < Arb[nod])
          maxim = Arb[nod];
        return;
     }
     else
     {
     if (start <= (st + dr) / 2) Query(2 * nod, st, (st + dr) / 2);
     if (fin > (st + dr) / 2) Query(2 * nod + 1, (st + dr) / 2 + 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 main()
{
        freopen("scmax.in","r",stdin);
        freopen("scmax.out","w",stdout);

        scanf("%d",&n);
        for(int i = 1; i <= n; i++)
         scanf("%d",&A[i]);
        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);




    return 0;
}