Cod sursa(job #347109)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 11 septembrie 2009 01:09:30
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
/* L.I.S. cu Arbori indexati binari
   O(N * log N)
*/
#include<stdio.h>
#include<algorithm>

using namespace std;

int sir[100010];
int S[100010];
int BIT[100010];
int n;
int bst[100010];
int maxG;
int CautBin(int val)
{
    int st = 1;
    int dr = n;
    while (st <= dr)
     {
         if (S[(st + dr) / 2] > val) dr = (st + dr) / 2 - 1;
          else
         if (S[(st + dr) / 2] < val) st = (st + dr) / 2 + 1;
          else
           return (st + dr) / 2;
     }
}
int Query(int p)
{
    int max = 0;
    while (p > 0)
      {
          if (max < BIT[p]) max = BIT[p];
          p -= (p & -p);
      }
     return max;
}
int Update(int p, int maxL)
{
    if (p <= n)
     {
         if (maxL > BIT[p]) BIT[p] = maxL;
         p += (p & -p);
     }
}
int main()
{
        freopen("scmax.in","r",stdin);
        freopen("scmax.out","w",stdout);

        scanf("%d",&n);
        for(int i = 1; i <= n ; i++)
        {
         scanf("%d",&sir[i]);
         S[i] = sir[i];
        }
        sort(S + 1, S + n + 1);
        for(int i = 1; i <= n; i++)
         sir[i] = CautBin(sir[i]);

        for(int i = 1; i <= n; i++)
         {
             int best = 0;
             if (sir[i] > 1)
             best = Query(sir[i] - 1);
             bst[i] = best + 1;
             Update(sir[i],best + 1);
         }
         for(int i = 1; i <= n; i++)
          {
              if (maxG < bst[i]) maxG = bst[i];
          }
         printf("%d", maxG);


}