Pagini recente » Cod sursa (job #3147000) | Cod sursa (job #3195035) | Cod sursa (job #446621) | Cod sursa (job #2528334) | Cod sursa (job #2505591)
#include <iostream>
#include <fstream>
#include <utility>
#include <algorithm>
#define DEBUG 0
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int tree[100001];
pair<int, int> v[100001];
int n;
int query(int poz)
{
int s = 0;
for(int i = poz; i; i -= i&-i)
s = max(s, tree[i]);
return s;
}
void update(int poz, int val)
{
for(int i = poz; i <= n; i += i&-i)
tree[i] = max(val, tree[i]);
}
bool comp(pair<int, int> x, pair<int, int> y)
{
if(x.first == y.first)
return(x.second > y.second);
return(x.first < y.first);
}
int main()
{
in >> n;
for(int i = 1; i <= n; i++)
{
in >> v[i].first;
v[i].second = i;
}
sort(v+1, v+n+1, comp);
if(DEBUG)
for(int i = 1; i <= n; i++)
cout << v[i].first << ' ' << v[i].second << '\n';
for(int i = 1; i <= n; i++)
{
int nr = query(v[i].second-1);
update(v[i].second, nr+1);
if(DEBUG)
{
cout << nr << '\n' << v[i].first << ' ' << v[i].second << "\n\n";
}
}
out << query(n);
return 0;
}