Pagini recente » Cod sursa (job #3147920) | Cod sursa (job #2313726) | Cod sursa (job #1066586) | Cod sursa (job #628592) | Cod sursa (job #2167264)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream h("scmax.in");
ofstream g("scmax.out");
vector<int> a, b; //a vectorul cu valori initiale, b vector de indici pentru cele mai mari subsiruri la un moment dat
int t[100020], n; //t retine indici ai valorilor care sunt inainte de i (t[i] = k inseamna ca dupa valoarea din indicele k urmeaza valoarea cu indicele i din a)
void cmlsc(vector<int> &a, vector<int> &b){
int c=0, f=0, l=0;
b.push_back(0); //adaugam indicele primei valori din a
t[0]=0;
for(int i=1; i<a.size(); i++){
if(a[i]>a[b.back()]){ // daca valoarea urmatoare (a[i] unde i pleaca de pe 1 nu de pe 0) este mai mare ca ultima valoare cu indicele din b.back() o adaug in b si o marchez in t
t[i]=b.back();
b.push_back(i);
}
for(f=0, l=b.size()-1; f<l;){ //daca prima conditie nu e indeplinita inseamna ca numarul meu este undeva intre 2 valori deci caut binar cea mai mica valoare mai mare a a[i]
c=(f+l)/2;
if(a[i]>a[b[c]])f=c+1; else l=c;
}
if(a[i]<a[b[l]]){ //daca mi-a gasit o valoare inlocuieste valoarea respectiva cu cea de la momentul i si marcheaza in t dupa ce valoare urmeaza
b[l]=i;
if(l>0) t[i]=b[l-1];
}
}
for(l=b.size(), f=b.back(); l--; f=t[f])b[l]=f; //parcurge vectorul t in sens invers punand in b indicii valorilor care fac parte din cel mai mare subsir crescator
}
int main()
{
h>>n;
for(int i=1; i<=n; i++){
int x;
h>>x;
a.push_back(x);
}
cmlsc(a, b);
g<<b.size()<<"\n";
for(int i=0; i<b.size(); i++)g<<a[b[i]]<<" ";
return 0;
}