Pagini recente » Cod sursa (job #400800) | Cod sursa (job #2909736) | Cod sursa (job #311132) | Cod sursa (job #404182) | Cod sursa (job #804022)
Cod sursa(job #804022)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
clock_t start=clock();
FILE *f = fopen("scmax.in", "r");
FILE *g = fopen("scmax.out", "w");
int N, K;
int A[100009];
int v[100009];
int res[100009];
int bst[100009];
int aib[100009];
char BUFF[8192];
char *ptr = BUFF;
void read(int &a)
{ a = 0;
if(*ptr == '\0') fread(BUFF, 8192, 1, f), ptr = BUFF;
while(*ptr < '0' || *ptr > '9')
{ ptr++;
if(*ptr == '\0') fread(BUFF, 8192, 1, f), ptr = BUFF;
}
while(*ptr >= '0' && *ptr <= '9')
{ a = a * 10 + *ptr - '0';
ptr++;
if(*ptr == '\0') fread(BUFF, 8192, 1, f), ptr = BUFF;
}
}
int query(int idx)
{ int ans = 0;
while(idx)
{ if(bst[ans] < bst[aib[idx]])
ans = aib[idx];
idx -= (idx & -idx);
}
return ans;
}
void update(int idx, int i)
{ while(idx <= N)
{ if(bst[aib[idx]] < bst[i])
aib[idx] = i;
idx += (idx & -idx);
}
}
void write(int ind)
{ if(ind == 0) return;
write(v[ind]);
fprintf(g, "%d ", res[ind]);
}
int main()
{ int i, j;
int ans = 0;
read(N);
for(i = 1; i <= N; i++)
{ read(A[i]);
res[i] = v[i] = A[i];
}
sort(v + 1, v + N + 1);
for(i = 2, K = 1; i <= N; i++) //elimin duplicatele
if(v[i] != v[i - 1])
v[++K] = v[i];
for(i = 1; i <= N; i++)
A[i] = lower_bound(v + 1, v + K + 1, A[i]) - v;
for(i = 1; i <= N; i++)
{ j = query(A[i] - 1);
bst[i] = bst[j] + 1;
v[i] = j;
if(bst[ans] < bst[i]) ans = i;
update(A[i], i);
}
fprintf(g, "%d\n", bst[ans]);
write(ans);
cout << 1.0*(clock()-start)/(1.0*CLOCKS_PER_SEC) << '\n';
fclose(f);
fclose(g);
return 0;
}