Pagini recente » Cod sursa (job #1868797) | Cod sursa (job #2166604) | Cod sursa (job #1491327) | Cod sursa (job #2312900) | Cod sursa (job #2551208)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
/*
ifstream fin("scmax.in");
ofstream fout("scmax.out");*/
FILE* fin=fopen("scmax.in","r");
FILE* fout=fopen("scmax.out","w");
const int NMAX=100010;
int n,poz[NMAX];
vector<pair<int,int> >v;
int initial[NMAX];
int sol[NMAX];
int aib[NMAX];
int ind[NMAX];
int pre[NMAX];
int stiva[NMAX];
struct comparator{
bool operator()(pair<int,int> a, pair<int,int> b){
if (a.first==b.first)
return a.second<b.second;
return a.first<b.first;
}
};
void citire()
{
fscanf(fin,"%d",&n);
v.push_back(pair<int,int>(0,0));
pair<int,int> cont;
for (int i=1; i<=n; i++){
fscanf(fin,"%d",&cont.first);
cont.second=i;
v.push_back(cont);
}
}
void salvare()
{
for (int i=1; i<=n; i++)
initial[i]=v[i].first;
}
void stabilirePozitii()
{
for (int i=1; i<=n; i++){
poz[v[i].second]=i;
int j=i+1;
while (j<=n){
if (v[i].first==v[j].first){
poz[v[j].second]=i;
j++;
}else{
break;
}
}
i=j-1;
}
}
pair<int,int> query(int j)
{
int maxim=0, pozMx=-1;
while (j>0){
if (aib[j]>maxim){
maxim=aib[j];
pozMx=ind[j];
}
j-=(j&(~(j-1)));
}
return pair<int,int>(maxim,pozMx);
}
void update(int i,int val,int indice)
{
while (i<=n){
if (val>aib[i]){
aib[i]=val;
ind[i]=indice;
}
i+=(i&(~(i-1)));
}
}
void rezolvare()
{
pair<int,int> rezultat;
for (int i=1; i<=n; i++){
rezultat=query(poz[i]-1);
sol[i]=rezultat.first+1;
pre[i]=rezultat.second;
update(poz[i],sol[i],i);
}
}
void afisareRecursiv(int i)
{
if (i!=-1){
afisareRecursiv(pre[i]);
fprintf(fout,"%d",initial[i]);
fprintf(fout,"%c",' ');
}
}
void afisare()
{
int mx=0,pozMx=-1;
for (int i=1; i<=n; i++){
if (sol[i]>mx){
mx=sol[i];
pozMx=i;
}
}
fprintf(fout,"%d",mx);
fprintf(fout,"%c",'\n');
while (pozMx!=-1){
stiva[0]++;
stiva[stiva[0]]=pozMx;
pozMx=pre[pozMx];
}
for (int i=stiva[0]; i>=1; i--){
fprintf(fout,"%d %c",initial[stiva[i]],' ');
}
}
int main()
{
citire();
salvare();
sort(v.begin()+1,v.end(),comparator());
stabilirePozitii();
rezolvare();
afisare();
}