Cod sursa(job #3038071)

Utilizator AndreiMLCChesauan Andrei AndreiMLC Data 26 martie 2023 20:01:23
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <set>
using namespace std;

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

struct pos {
	int len;
	int ind;
	int val;
};
int n;
int maxlen = 1;
int v[100005];
int d[100005];
int poz[100005];
int da[100005];
int start=1;
int nr=1;
void din()
{
	int len = 0;
	f >> n;
	for (int i = 1; i <= n; i++)
	{
		f >> v[i];
	}
	d[n] = 1;
	poz[n] = -1;
	for (int i = n - 1; i >= 1; i--)
	{
		d[i] = 1;
		poz[i] = -1;
		for (int j = i + 1; j <= n; j++)
		{
			if (v[j] > v[i] && d[i] < d[j] + 1)
			{
				d[i] = d[j] + 1;
				poz[i] = j;
				if (maxlen < d[i])
				{
					maxlen = max(maxlen, d[i]);
					start = i;
				}

			}
		}
	}
	g << maxlen << '\n';
	int i = start;
	while (i != -1)
	{
		g << v[i] << ' ';
		i = poz[i];
	}
}

int cautbin(int a)
{
	//nr - nr tot de numere de dupa poz ?
	int st=0, dr=nr;
	int mij = (st + dr) / 2;
	while (st <= dr)
	{
		if (v[da[mij]] < a && v[da[mij + 1]] >= a)
		{
			return mij;
		}
		else if (v[da[mij+1]] < a)
		{
			st = mij + 1;
		}
		else {
			dr = mij - 1;
		}
		mij = (st + dr) / 2;
	}
	return nr;
}

void afis(int i)
{
	if (poz[i] > 0)
	{
		afis(poz[i]);
	}
	g << v[i] << ' ';
}
void optim()
{
	f >> n;
	for (int i = 1; i <= n; i++)
	{
		f >> v[i];
	}
	d[1] = da[1] = 1;
	da[0] = 0;
	for (int i = 2; i <= n; i++)
	{
		int x = cautbin(v[i]);
		d[i] = x+1;
		poz[i] = da[x];
		da[x + 1] = i;
		if (nr < x + 1)
		{
			nr = x + 1;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		if (maxlen < d[i])
		{
			maxlen = d[i];
			start = i;
		}
	}
	g << maxlen << '\n';
	///start == final 
	afis(start);
}
int main()
{
	//din();
	optim();
}