Pagini recente » Cod sursa (job #1488001) | Cod sursa (job #2570820) | Cod sursa (job #2395342) | Cod sursa (job #3222878) | Cod sursa (job #633703)
Cod sursa(job #633703)
#include <stdio.h>
#include <algorithm>
#define DIM 100001
using namespace std;
int V[DIM], W[DIM], A[DIM], i, p, N, Maxim, Max, K;
inline int lsb(int x) {
return x & -x;
}
int cauta(int x) {
int p = 1, u = K, m;
while (p<=u) {
m = (p+u) / 2;
if (W[m] == x)
return m;
if (W[m] < x)
p = m+1;
else
u = m-1;
}
}
int query (int p) {
int maxim = 0;
for (;p;p-=lsb(p)) {
if (maxim < A[p])
maxim = A[p];
}
return maxim;
}
void update(int p, int v) {
for (;p<=K;p+=lsb(p))
if (A[p] < v)
A[p] = v;
}
int main() {
FILE *f = fopen("scmax.in","r");
FILE *g = fopen("scmax.out","w");
fscanf(f,"%d",&N);
for (i=1;i<=N;i++) {
fscanf(f,"%d",&V[i]);
W[i] = V[i];
}
fclose(f);
sort(W+1, W+N+1);
K = 1;
for (i=2;i<=N;i++)
if (W[i] != W[K])
W[++K] = W[i];
// A[i] = maximul din L pentru valori ce corespund elementelor din V din intervalul [ V[i-2^k + ] V[i] ]
for (i=1;i<=N;i++) {
p = cauta(V[i]);
int Max = query(p-1);
if (1+Max > Maxim)
Maxim = 1 + Max;
update(p, 1+Max);
}
fprintf(g,"%d\n",Maxim);
return 0;
}