Cod sursa(job #2275035)
Utilizator | Data | 2 noiembrie 2018 19:45:38 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 10 |
Compilator | cpp-64 | Status | done |
Runda | alexei1 | Marime | 2.08 kb |
#include <fstream>
using namespace std;
int v[100002],q[100002],p[100002];
int main()
{
int n,i,j;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
fin>>n;
for (i=1; i<=n; i++)
{
fin>>v[i];
}
q[1]=v[1];
p[1]=1;
int u=1;
for (i=2; i<=n; i++)
{
if (u==1)
{
if (v[i]<=q[u])
{
q[u]=v[i];
p[i]=1;
}
if (v[i]>q[u])
{
u++;
q[u]=v[i];
p[i]=u;
}
}
else
{
if (v[i]<=q[u] && v[i]>=q[1])
{
int x,OK=1,p1=1,d=2;
while (p1<u && OK==1)
{
int m=(p1+u)/2;
if (v[i]>q[m])
{
p1=m+1;
d=-1;
}
if (v[i]<q[m])
{
u=m-1;
d=1;
}
if (v[i]==q[m])
{
x=m;
OK=-1;
}
}
if (OK!=-1)
{
if (d==1)
{
x=u+1;
}
if (d==-1)
{
x=p1;
}
}
q[x]=v[i];
p[i]=x;
}
if (v[i]>q[u])
{
u++;
q[u]=v[i];
p[i]=u;
}
if (v[i]<q[1])
{
q[1]=v[i];
p[i]=1;
}
}
}
fout<<u<<"\n";
int o=u;
for (i=n; i>=1; i--)
{
if (p[i]==u)
{
q[u]=i;
u--;
}
}
for (i=1; i<=o; i++)
fout<<v[q[i]]<<" ";
return 0;
}