Pagini recente » Cod sursa (job #1879011) | Cod sursa (job #266462) | Cod sursa (job #71992) | Cod sursa (job #930905) | Cod sursa (job #695676)
Cod sursa(job #695676)
#include <fstream>
#include <algorithm>
#define NMAX 100011
using namespace std;
int v[NMAX],a[NMAX],t[NMAX],pos[NMAX];
int N,i,m,k,st,dr,nr;
int main(){
ifstream f("scmax.in");
ofstream g("scmax.out");
f>>N;
for(i=1;i<=N;i++)
f>>v[i];
for(i=1;i<=N;i++)
if(v[i]>a[k]){
a[++k]=v[i];
pos[k]=i; t[i]=pos[k-1];
}
else{
st=1; dr=k;
while(st<=dr){
m=(st+dr)/2;
if(a[m-1]<v[i] && a[m]>v[i]){
a[m]=v[i];
pos[m]=i, t[i]=pos[m-1];
break;
}
else if(a[m-1]<v[i] && a[m]<v[i])
st=m+1;
else if(a[m-1]>v[i] && a[m]>v[i])
dr=m-1;
else break;
}
}
nr=1;
a[nr]=v[pos[k]];
k=t[pos[k]];
while(k){
a[++nr]=v[k]; k=t[k];
}
reverse(a+1,a+nr+1);
g<<nr<<"\n";
for(i=1;i<=nr;i++)
g<<a[i]<<" ";
g<<"\n";
f.close(); g.close();
return 0;
}