Pagini recente » Cod sursa (job #823678) | Cod sursa (job #2193396) | Cod sursa (job #3357654) | Cod sursa (job #3214450) | Cod sursa (job #1356492)
#include <stdio.h>
#include <algorithm>
#define NMAX 100023
#define inf 2000000023
FILE *fin, *fout;
int n, v[NMAX], poz, dr = 0, maxn, p;
struct ceva
{
int val;
int tata;
int pos;
} arr[NMAX], d[NMAX], temp;
bool comp(ceva a, ceva b)
{
return (a.val <= b.val);
}
void afisare(int a)
{
if(a == 0) return;
afisare(arr[a-1].tata);
printf("%d ", v[a-1]);
}
int main()
{
fin = freopen("scmax.in", "r", stdin);
fout = freopen("scmax.out", "w", stdout);
scanf("%d", &n);
for(int i = 0; i< n; i++) scanf("%d", &v[i]);
for(int i = 0; i< n; i++) d[i].val = inf;
for(int i = 0; i< n; i++)
{
temp.val = v[i];
poz = std::upper_bound(d, d+dr, temp, comp) - d;
dr = poz+1;
d[poz].val = v[i];
d[poz].pos = i+1;
if(poz == 0) d[poz].tata = 0;
else d[poz].tata = d[poz-1].pos;
arr[i].val = poz+1;
arr[i].tata = d[poz].tata;
}
for(int i = 0; i< n; i++)
{
if(arr[i].val > maxn)
{
maxn = arr[i].val;
p = i+1;
}
}
printf("%d\n", maxn);
afisare(p);
fclose(fin);
fclose(fout);
return 0;
}