Pagini recente » Cod sursa (job #59171) | Cod sursa (job #862454) | Cod sursa (job #2637395) | Cod sursa (job #119708) | Cod sursa (job #2930648)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
void normalizare(vector<int> &a);
int query(int nr, const vector<int> &aib);
void update(int nr, int lun, vector<int> &aib);
int main()
{
ifstream fin("scmax.in"); /// TODO!!!
ofstream fout("scmax.out");
int n;
fin >> n;
vector<int> a(n);
for (auto &r : a)
fin >> r;
normalizare(a);
/*for (auto i : a)
fout << i << ' ';
fout << '\n';*/
vector<int> aib(n+1);
int sol = 0;
for (int i = 0; i < n; ++i) {
int nr = a[i];
int lun = query(nr-1, aib);
int curr = lun + 1;
sol = max(sol, curr);
update(nr, curr, aib);
}
fout << sol;
return 0;
}
void normalizare(vector<int> &a)
{
vector<int> b = a;
sort(b.begin(), b.end());
unique(b.begin(), b.end());
for (auto &r : a) {
auto it = lower_bound(b.begin(), b.end(), r);
r = 1 + (it - b.begin());
}
}
int query(int nr, const vector<int> &aib)
{
int rez = 0;
while (nr) {
rez = max(rez, aib[nr]);
//nr -= ((nr ^ (nr-1)) & nr);
nr = (nr & (nr-1));
}
return rez;
}
void update(int nr, int lun, vector<int> &aib)
{
int n = aib.size() - 1;
while (nr <= n) {
aib[nr] = max(aib[nr], lun);
nr += ((nr ^ (nr-1)) & nr);
}
}