Pagini recente » Cod sursa (job #1020423) | Cod sursa (job #137338) | Cod sursa (job #469089) | Cod sursa (job #451441) | Cod sursa (job #347109)
Cod sursa(job #347109)
/* 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);
}