Pagini recente » Cod sursa (job #2730469) | Cod sursa (job #263050) | Cod sursa (job #850548) | Cod sursa (job #1254395) | Cod sursa (job #2577366)
#include <stdio.h>
#include <map>
#include <vector>
#include <algorithm>
#define SZ(x) ((int)(x.size()))
#define pb push_back
#define nmax 100010
using namespace std;
int n, n_size;
int a[nmax], dp[nmax], aib[nmax];
vector <int> p;
map <int, int> mp;
inline int lsb(int x) { return x & (-x); }
void update(int pos, int val)
{
for (int i = pos; i <= n_size; i += lsb(i)) aib[i] = max(aib[i], val);
}
int query(int pos)
{
int val = 0;
for (int i = pos; i >= 1; i -= lsb(i)) val = max(val, aib[i]);
return val;
}
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]); p.pb(a[i]);
}
sort(p.begin(), p.end());
n_size = 0;
for (int i = 0; i < SZ(p); i++)
if (mp.find(p[i]) == mp.end()) mp[p[i]] = ++n_size;
for (int i = 1; i <= n; i++) {
int idx = mp[a[i]];
if (idx == -1) continue;
dp[i] = query(idx - 1) + 1;
update(idx, dp[i]);
mp[a[i]] = -1;
}
int best = 0;
for (int i = 1; i <= n; i++) best = max(best, dp[i]);
printf("%d", best);
return 0;
}