Cod sursa(job #2122591)

Utilizator flibiaVisanu Cristian flibia Data 5 februarie 2018 12:13:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
#define L (pos << 1)
#define R (L | 1)

using namespace std;

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

struct lol{
	int val, idx;
};

int n, cnt, pv[100100], value[100100], last;
lol a[100100], h[400100];

bool cmp(const lol &a, const lol &b){
	return a.val < b.val;
}

bool cmp2(const lol &a, const lol &b){
	return a.idx < b.idx;
}

void update(int st, int dr, int pos, int idx, lol nr){
	if(st == dr){
		if(nr.val > h[pos].val)
			h[pos] = nr;
		return;
	}
	int mid = st + dr >> 1;
	if(idx <= mid)
		update(st, mid, L, idx, nr);
	else 
		update(mid + 1, dr, R, idx, nr);
	h[pos] = (h[L].val > h[R].val ? h[L] : h[R]);
}

lol query(int st, int dr, int pos, int l, int r){
	if(l <= st && dr <= r)
		return h[pos];
	int mid = st + dr >> 1;
	lol left, right;
	left = right = {0, 0};
	if(l <= mid)
		left = query(st, mid, L, l, r);
	if(r > mid)	
		right = query(mid + 1, dr, R, l, r);
	return (left.val > right.val ? left : right);
}

void dive(int p){
	if(p == 0)
		return;
	dive(pv[p]);
	out << value[a[p].val] << ' ';
}

int main(){
	in >> n;
	for(int i = 1; i <= n; i++)
		in >> a[i].val, a[i].idx = i;
	sort(a + 1, a + n + 1, cmp);
	last = 0;
	for(int i = 1; i <= n; i++){
		if(a[i].val > last){
			last = a[i].val;
			cnt++;
			value[cnt] = last;
		}
		a[i].val = cnt;
	}
	sort(a + 1, a + n + 1, cmp2);
	for(int i = 1; i <= n; i++){
		int p = a[i].val;
		if(p == 1){
			update(1, cnt, 1, p, {1, i});
			continue;
		}
		lol w = query(1, cnt, 1, 1, p - 1);
		w.val++;
		pv[i] = w.idx;
		w.idx = i;
		update(1, cnt, 1, p, w);
	}
	lol w = query(1, cnt, 1, 1, cnt);
	out << w.val << '\n';
	int p = w.idx;
	dive(p);
	return 0;
}