Pagini recente » Cod sursa (job #1355975) | Cod sursa (job #1734835) | Cod sursa (job #2242488) | Cod sursa (job #708223) | Cod sursa (job #1097350)
#include<fstream>
#include<iostream>
using namespace std;
ofstream out("scmax.out");
int n,val[100100],v[100100],best[100100],tata[100100],nr,sol,pozfin;
void citire() {
ifstream in("scmax.in");
int i;
in>>n;
for(i=1;i<=n;i++)
in>>val[i];
in.close();
}
int cautbin(int x) {
int st,dr,mij;
st=0;
dr=nr;
mij=(st+dr)/2;
while(st<=dr){
if(val[v[mij]]<x&&val[v[mij+1]]>=x)
return mij;
if(val[v[mij]]>x) {
dr=mij-1;
mij=(st+dr)/2;
}
if(val[v[mij]]<x) {
st=mij+1;
mij=(st+dr)/2;
}
}
return nr;
}
void solve() {
int i,poz;
nr=1;
best[1]=1;
v[1]=1;
for(i=2;i<=n;i++){
poz=cautbin(val[i]);
best[i]=poz+1;
tata[i]=v[poz];
if(v[poz+1]==0 || val[best[poz+1]]>val[i])
v[poz+1]=i;
if(nr<poz+1)
nr=poz+1;
if(sol<best[i]) {
sol=best[i];
pozfin=i;
}
}
}
void afis(int i) {
if(tata[i]!=0)
afis(tata[i]);
out<<val[i]<<' ';
}
void afisare() {
out<<sol<<'\n';
afis(pozfin);
out.close();
}
int main() {
citire();
solve();
afisare();
return 0;
}