Cod sursa(job #677094)

Utilizator nautilusCohal Alexandru nautilus Data 9 februarie 2012 20:58:50
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream>
#include<vector>
using namespace std;
#define NMAX 100010

int n;
int a[NMAX],poz[NMAX];
vector<int> q;
int elem,pozcautare,lungscmax;
int sol[NMAX];

void read()
{
 int i;
 ifstream fin("scmax.in");
 fin>>n;
 for (i=1; i<=n; ++i)
	 fin>>a[i];
 fin.close();
}

void cauta(int st, int dr)
{
 int mijl = (dr - st) / 2 + st;
 if (st <= dr)
	 if (q[mijl] >= elem)
		{
		 pozcautare = min(pozcautare, mijl);
		 cauta(st, mijl-1);
		} else
		cauta(mijl+1, dr);
}

void solve()
{
 int i;
 for (i=1; i<=n; ++i)
	{
	 pozcautare = NMAX; elem = a[i];
	 cauta( 0, (int)q.size()-1 );
	 if (pozcautare == NMAX)
		{
		 q.push_back(a[i]);
		 poz[i] = q.size() - 1;
		} else
		{
		 q[pozcautare] = a[i];
		 poz[i] = pozcautare;
		}
	}
 lungscmax = q.size();
}

void write()
{
 int i,k;
 ofstream fout("scmax.out");
 fout<<lungscmax<<'\n';

 k = lungscmax; i = n;
 while (k != 0)
	{
	 if (poz[i] == k - 1)
		{
		 sol[k] = a[i];
		 k--;
		}
	 i--;
	}
 for (i=1; i<=lungscmax; ++i)
	 fout<<sol[i]<<" ";
 fout<<'\n';
 fout.close();
}

int main()
{
 read();
 solve();
 write();
 return 0;
}