Cod sursa(job #2184295)

Utilizator DimaTCDima Trubca DimaTC Data 23 martie 2018 22:00:06
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include<bits/stdc++.h>
#define NMAX 100010
using namespace std;

#define DIM 100000
char buff[DIM];
int poz=0;


void read(int &nr) {
	nr=0;
	char semn='+';
	while (buff[poz]<'0' || buff[poz]>'9') {
		semn=buff[poz];
		if (++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
	}
	
	while (buff[poz]>='0' && buff[poz]<='9') {
		nr=nr*10+buff[poz]-'0';
	}
	if (semn=='-') nr=-nr;
	
}

int n,a[NMAX],t[NMAX],d[NMAX];

void rec(int p) {
	if (p==0) return;
	else {
		rec(t[p]);
		cout<<a[p]<<" ";
	}
}

int main() {
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","r",stdout);
		
	cin>>n;
	for (int i=1; i<=n; i++) cin>>a[i];
	
	int k=1; d[1]=1;
	for (int i=1; i<=n; i++) {
		int st=1,dr=k;
		while (st<=dr) {
			int mid=(st+dr)/2;
			if (a[d[mid]]>=a[i]) dr=mid-1;
			else st=mid+1;
		}
		if (st==k+1) k++;
		d[st]=i;
		t[i]=d[st-1];
	}
	cout<<k<<'\n';
	rec(d[k]);
	
	return 0;
}