Pagini recente » Cod sursa (job #1298989) | Cod sursa (job #1513382) | Cod sursa (job #641141) | Cod sursa (job #965339) | Cod sursa (job #2158131)
// facem varianta de 70 de pt cu programare dinamica.
// am revenit si am o varianta de 100 cu cautare binara.
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int lg,n,i,j,h,v[100005],s,pr[100005];
struct el
{ int x,e; } q;
vector<el> tail;
vector<int> rz;
int cbin(int k)
{
int st=1,dr=lg-1,m=0;
while(st<=dr)
{
m=st+(dr-st)/2;
if(tail[m].x>=k) dr=m-1;
else st=m+1;
}
if(tail[m].x<k) m++;
if(tail[m-1].x>=k) m--;
return m;
}
int main () {
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i];
q.x=v[1]; q.e=1;
tail.push_back(q);
lg=0;
for(i=2;i<=n;i++)
{
if(v[i]<tail[0].x)
{
tail[0].x=v[i];
tail[0].e=i;
s=0;
}
else if(v[i]>tail[lg].x)
{
q.x=v[i]; q.e=i;
pr[i]=tail[lg].e;
tail.push_back(q);
lg++;
}
else
{
h=cbin(v[i]);
if(v[i]<tail[h].x)
{
pr[i]=tail[h-1].e;
tail[h].x=v[i];
tail[h].e=i;
}
}
}
fout<<lg+1<<"\n";
h=tail[lg].e;
j=lg+1;
while(j)
{
j--;
rz.push_back(v[h]);
h=pr[h];
}
for(j=(int)rz.size()-1;j>=0;j--)
fout<<rz[j]<<" ";
}