Pagini recente » Cod sursa (job #1507383) | Cod sursa (job #1966910) | Cod sursa (job #1056699) | Cod sursa (job #1848182) | Cod sursa (job #2427690)
#include <iostream>
#include <fstream>
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int n;
int v[100500];
int l[100500];
int pre[100500];
int countt;
int bin_search(int x, int low, int high)
{
if(low==high)
return low;
if(low==high-1)
{
if(v[l[low]]==x) return -1;
if(v[l[high]]==x) return -1;
if(v[l[high]]<x) return low;
return high;
}
int m = low + (high-low)/2;
if(v[l[m]]>x)
return bin_search(x,low,m);
if(v[l[m]]==x) return -1;
return bin_search(x,m,high);
}
void write(int x)
{
if(x==-1)return;
write(pre[x]);
fout<<v[x]<<" ";
}
void debug()
{
for(int i=0;i<n;i++)
std::cout<<pre[i]<<" ";
std::cout<<"\n";
for(int i=0;i<n;i++)
std::cout<<l[i]<<" ";
std::cout<<"\n";
std::cout<<"\n";
}
int main()
{
fin>>n;
for(int i=0;i<n;i++)
{
pre[i]=-1;
l[i]=-1;
fin>>v[i];
}
for(int i=0;i<n;i++)
{
// if(countt>=1)
// write(l[countt-1]);
// debug();
if(countt==0)
{
l[0]=i;
pre[i]=-1;
countt++;
}
else if(v[l[0]]>v[i])
{
l[0]=i;
pre[i]=-1;
}
else if(v[l[countt-1]]<v[i])
{
pre[i]=l[countt-1];
countt++;
l[countt-1]=i;
}
else
{
int place = bin_search(v[i],0,countt);
if(place==-1)continue;
pre[i]=l[place-1];
l[place]=i;
}//*/
}
fout<<countt<<"\n";
write(l[countt-1]);
}