Cod sursa(job #2794240)

Utilizator TeodorMarciucMarciuc Teodor TeodorMarciuc Data 4 noiembrie 2021 15:33:56
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include<iostream>
#include<fstream>
using namespace std;
int lg[100005], n, i, j,x,mini=9999999,ind,v[100005],dp[100005],ans[100005];
int cautare(int st, int dr, int ind)
{
	while (st <= dr) {
		int mid = (st + dr) / 2;
		if (v[ind] > v[lg[mid]]) st = mid + 1;
		else dr = mid - 1;
	}
	return st;
}
int main()
{
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
	cin >> n;
	for (i = 1;i <= n;i++) {
		cin >> v[i];
		if (v[i] > v[lg[j]])
			lg[++j] = i, dp[i] = j;
		else if (v[i] < lg[1]) lg[1] = i, dp[i] = 1;
		else {
			x = cautare(1, j, i);
			lg[x] = i;
			dp[i] = x;
		}
	}
		ans[1] = lg[j];
		j = lg[j] - 1;
		i = 1;
		while (j)
		{
			if (dp[j] == dp[ans[i]] - 1)
			{
				ans[++i] = j;
			}
			j--;
		}
		cout << i << '\n';
		for (j = i;1 <= j;j--)
			cout << v[ans[j]] << " ";
}