Pagini recente » Cod sursa (job #1075463) | Cod sursa (job #842615) | Cod sursa (job #1436559) | Cod sursa (job #1916060) | Cod sursa (job #350717)
Cod sursa(job #350717)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <set>
#include <cstdlib>
using namespace std;
const int VMAX = 100001;
int v[VMAX];
int best[VMAX];
int arbore[4 * VMAX];
set<int> all;
int v2[VMAX];
int allV[VMAX], dv = 0;
int compareints (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
void update(int pos, int valoare, int nod, int st, int dr) {
if (pos < st || pos > dr) return;
if (dr < st) return;
arbore[nod] = max(arbore[nod],valoare);
if (st == dr) return;
int mijloc = (st + dr) / 2;
update(pos, valoare, nod * 2, st, mijloc);
update(pos, valoare, nod * 2 + 1, mijloc + 1, dr);
}
int query(int l, int r, int nod, int st, int dr) {
if (dr < st) return -1;
if (r < st) return -1;
if (l > dr) return -1;
if (l <= st && r >= dr) return arbore[nod];
int mijloc = (st + dr) / 2;
return max(query(l, r, nod * 2, st, mijloc), query(l, r, nod * 2 + 1, mijloc + 1, dr));
}
int main() {
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
fin>>n;
for (int i = 0; i < n; ++i) {
fin>>v[i];
v2[i] = v[i];
}
sort(v2, v2 + n);
for (int i = 0; i < n; ++i)
if (i == 0 || v2[i] != v2[i - 1])
allV[dv++] = v2[i];
return 0;
for (int i = 0; i < n; ++i) {
int sol = 0, step = 1<<20;
for (; step; step>>=1) {
if (sol + step < dv && allV[sol + step] <= v[i]) {
sol += step;
}
}
v[i] = sol;
}
int solutie = 0;
for (int i = 0; i < n; ++i) {
int mx = 1;
if (v[i] > 0)
mx += query(0, v[i] - 1, 1, 0, n);
update(v[i], mx, 1, 0, n);
solutie = max(solutie, mx);
}
fout<<solutie;
// cout<<solutie;
fout.close();
return 0;
}