Cod sursa(job #3001462)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 13 martie 2023 17:57:32
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
#include <cmath>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>

#define NMAX 100003
using namespace std;

FILE* fin, * fout;

int n,m,niv;
int v[NMAX];//elementele
int tata[NMAX];//idee ca la paduri de multimi(retin tatal elementului pe care vreau sa il pun in subsir ca fiind elementul de pe poz-1 de unde vreau sa il pun)
int sortat[NMAX];//vectorul pt scm

int cBin(int nr)
{
	int st = 1, dr = niv,sol=niv+1;
	while (st <= dr)
	{
		int mij = (st + dr) / 2;
		if (v[sortat[mij]] >= nr)
		{
			dr = mij - 1;
			sol = mij;
		}
		else { 
			st = mij + 1;
			
		}
	}
	return sol;
}

void adaugSCM(int poz)
{
	int pozitieSortat = cBin(v[poz]);
	tata[poz] = sortat[pozitieSortat - 1];//ii setez tatal 
	sortat[pozitieSortat] = poz;
	niv = max(niv, pozitieSortat);
}

int main()
{
	fin = fopen("scmax.in", "r");
	fout = fopen("scmax.out", "w");
	
	fscanf(fin, "%d", &n);
	for (int i = 1; i <= n; i++)
	{
		fscanf(fin, "%d", &v[i]);
		adaugSCM(i);
	}
	fprintf(fout, "%d\n", niv);
	vector<int>sol;
	int elem = sortat[niv];
	sol.push_back(elem);
	while (tata[elem] > 0)
	{
		elem = tata[elem];
		sol.push_back(elem);
	}
	for (int i = sol.size()-1; i >= 0; i--)
	{
		fprintf(fout, "%d ", v[sol[i]]);
	}
	return 0;
}