Pagini recente » Cod sursa (job #1954529) | Cod sursa (job #3276776) | Cod sursa (job #744427) | Cod sursa (job #3191048) | Cod sursa (job #2387560)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n;
int v[100005],best[100005],poz[100005],nr,cmax,pozmax,l[100003],pos;
char s[500000001];
void see(int x){
if(poz[x]!=-1 && poz[x]>=1)
see(poz[x]);
g<<v[x]<<" ";
}
void made(){
int j=1,i;
int n=strlen(s);
for(i=0; i<n; i++)
if(s[i]>='0' && s[i]<='9'){
v[j]=v[j]*10+s[i]-'0';
i++;
while(s[i]>='0' && s[i]<='9'){
v[j]=v[j]*10+s[i]-'0';
i++;
}
j++;
}
}
int caut1(int x){
int mij,li,ls;
li=0;
ls=nr;
mij=(li+ls)/2;
while(li<=ls){
if(v[l[mij]]<x && v[l[mij+1]]>=x) return mij;
if(v[l[mij+1]]<x){
li=mij+1;
mij=(li+ls)/2;
}
else
{
ls=mij-1;
mij=(li+ls)/2;
}
}
return nr;
}
int main(){
nr=1;
int i,j;
f>>n;
f.get();
//
f.getline(s,5000001);
made();
//for(i=1; i<=n; i++)
//f>>v[i];
best[1]=l[1]=1;
for(i=2; i<=n; i++){
pos=caut1(v[i]);
poz[i]=l[pos];
best[i]=pos + 1;
l[pos+1]=i;
if(nr<pos+1) nr = pos+1;
}
int maxim=0;
pos=0;
for(i=0; i<=n; i++)
if(maxim<best[i]){
maxim=best[i];
pos=i;
}
g<<maxim<<"\n";
see(pos);
/*g<<pos<<"\n";
for(i=1; i<=n; i++)
g<<best[i]<<" ";*/
return 0;
}