Cod sursa(job #2191158)

Utilizator DimaTCDima Trubca DimaTC Data 1 aprilie 2018 21:03:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
#include<algorithm>

using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

struct nod {
	int x, y;
} a[100005];

int p[100005], h[270000], L[100005];
int n,l,r, idx, mx;

bool cmp(nod l, nod r) {
	return (l.x<r.x || l.x==r.x && l.y>r.y);
}

void update(int st, int dr, int pos, int val) {
	if (st==dr) {
		h[pos] = val; 
		return;
	}
	int mid = (st+dr)/2;
	if (idx <= mid) update(st, mid, 2*pos, val);
	else update(mid+1, dr, 2*pos + 1, val);
	
	if (L[h[2*pos]] >= L[h[2*pos+1]]) h[pos] = h[2*pos];
	else h[pos] = h[2*pos + 1];
}

int query(int st, int dr, int pos) {
	if (l<=st && dr<=r) return h[pos];
	int mid = (st + dr)/2, left = 0, right = 0;
	if (l <= mid) left = query(st, mid, 2*pos);
	if (r > mid) right = query(mid+1, dr, 2*pos+1);
	
	if (L[left]>=L[right]) return left;
	else return right;
}

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

int main() {
	cin>>n;
	
	for (int i=1; i<=n; i++) cin>>a[i].x, a[i].y=i;
	
	sort(a+1,a+1+n, cmp);
	for (int i=1; i<=n; i++) {
		l=1; r=a[i].y;
		p[i] = query(1, n, 1);
		L[i] = L[p[i]] + 1;
		idx = a[i].y;
		update(1,n,1, i);
		if (L[i]>L[mx]) mx=i;
	}
	cout<<L[mx]<<"\n";
	rec(mx);
	
	
	return 0;
}