Pagini recente » Cod sursa (job #1388178) | Cod sursa (job #330173) | Cod sursa (job #684420) | Cod sursa (job #397805) | Cod sursa (job #2614086)
#include <bits/stdc++.h>
using namespace std;
ifstream r("scmax.in");
ofstream w("scmax.out");
int g[100001], aib[100001], d[100001], rasp[100001], n;
struct normalizare{
int val, ind;
}v[100001];
bool cmp(normalizare &a, normalizare &b){
if(a.val<b.val){
return true;
}
if(a.val>b.val){
return false;
}
if(a.ind>b.ind){
return true;
}
return false;
}
//De ce aib ia doar 70 de puncte din cauza serverului????
//NU e corect!!!!
//Vreau 100 cu aib, explicatii?
//Ha, o sa te fac
void update(int a, int b){
aib[a]=max(aib[a], b);
if(a+ (a & -a)>n){
return ;
}
update(a+ (a & -a), b);
}
int querry(int a){
if(a - (a & -a) == 0){
return aib[a];
}
return max(aib[a],querry(a - (a & -a)));
}
int main()
{
r>>n;
for(int i=1;i<=n;i++){
r>>v[i].val;
rasp[i]=v[i].val;
v[i].ind=i;
}
sort(v+1, v+n+1, cmp);
for(int i=1;i<=n;i++){
g[v[i].ind]=i;
}
int maxim=0, cnt=0;
for(int i=1;i<=n;i++){
d[i]=querry(g[i])+1;
update(g[i], d[i]);
maxim=max(maxim, d[i]);
}
w<<maxim<<"\n";
for(int i=n;i>=1;i--){
if(d[i]==maxim){
g[cnt]=rasp[i];
cnt++;
maxim--;
}
}
for(int i=cnt-1;i>=0;i--){
w<<g[i]<<" ";
}
return 0;
}