Pagini recente » Cod sursa (job #2106671) | Cod sursa (job #992276) | Cod sursa (job #668726) | Cod sursa (job #1525425) | Cod sursa (job #2795552)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("scmax.in");
ofstream g ("scmax.out");
int n,x,l_sir = 1;
int v[100001],v_final[100001],poz_in_v_final[100001];
int cb(int x)
{
int st = 1,dr = l_sir,mij,ans = l_sir+1;
while(st<=dr)
{
mij = (st+dr)/2;
if(v_final[mij]>=x)
{
ans = mij;
dr = mij-1;
}
else if (v_final[mij]<x)
st = mij+1;
}
return ans;
}
void afisare(int cnt,int poz)
{
if(cnt==0)
return;
for(int i = poz;i>=0;i--)
{
if(poz_in_v_final[i]==cnt)
{
afisare(cnt-1,i-1);
g << v[i]<< " ";
return;
}
}
}
/* trebuie sa afisam recursiv din vectorul poz_in_v_final si nu pur si simplu v_final pentru a afisa un subsir
de ex daca avem sirul 13 14 1 sirul din v_final va fi 1 14 ceea ce este greesit dar in poz_in_v_final va fi sirul 1 2 1
iar afisand recursiv afisam 13 14*/
int main()
{
f >> n;
f >> v[1];
v_final[1] = v[1];
poz_in_v_final[1] = 1;
for(int i = 2;i<=n;i++)
{
f >> v[i];
int poz = cb(v[i]);
v_final[poz] = v[i];
poz_in_v_final[i] = poz;
l_sir = max(l_sir,poz);
}
g <<l_sir<<'\n';
afisare(l_sir,n);
}