Pagini recente » Cod sursa (job #1486206) | Cod sursa (job #148035) | Cod sursa (job #842597) | Cod sursa (job #1852157) | Cod sursa (job #566142)
Cod sursa(job #566142)
#include <cstdio>
#include <cstdlib>
#include <list>
using namespace std;
FILE *fin=fopen("scmax.in","r");
FILE *fout=fopen("scmax.out","w");
int a[100000];
int v[100000];
int t[100000];
int cautbin(int st, int en, int x)
{
while (st<=en)
{
int m = (st+en)/2;
if (a[v[m]]<x)
st=m+1;
else
en=m-1;
}
return st;
}
int main (int argc, char * const argv[]) {
int n;
fscanf(fin, "%d\n",&n);
for (int i=0; i<n; i++)
fscanf(fin, "%d",&a[i]);
int sn = 0;
for (int i=0; i<n; i++)
{
int pos = cautbin(0,sn-1,a[i]);
v[pos] = i;
t[i]=pos?v[pos-1]:-1;
if (pos>=sn)
sn=pos+1;
}
int val = v[sn-1];
fprintf(fout, "%d\n",sn);
list<int> q;
while(val!=-1)
{
q.push_back(a[val]);
val=t[val];
}
while (!q.empty())
{
fprintf(fout, "%d ",q.back());
q.pop_back();
}
fclose(fin);
fclose(fout);
return 0;
}