Pagini recente » Cod sursa (job #380593) | Cod sursa (job #212184) | Cod sursa (job #2400270) | Cod sursa (job #594647) | Cod sursa (job #2296047)
#include <iostream>
#include <fstream>
#include <algorithm>
#define mkp make_pair
#define a first
#define b second
#define NMAX 100005
#define per pair<int,int>
using namespace std;
ifstream si("scmax.in");
ofstream so("scmax.out");
per aib[NMAX],v[NMAX];
int p[NMAX],r[NMAX],sol[NMAX];
int n;
void update(int poz,int x,int xpoz) {
for(;poz<=n;poz+=poz&(-poz)) {
if(aib[poz].a<x) {
aib[poz].a=x;
aib[poz].b=xpoz;
}
}
}
per querry(int poz) {
int m,mpoz;
for(m=0;poz;poz-=poz&(-poz)) {
if(aib[poz].a>m) {
m=aib[poz].a;
mpoz=aib[poz].b;
}
}
return mkp(m,mpoz);
}
int main() {
si>>n;
for(int i=1;i<=n;++i) {
si>>v[i].a;
v[i].b=-i;
r[i]=v[i].a;
}
sort(v+1,v+1+n);
per q;
int m=0,mpoz;
for(int i=1;i<=n;++i) {
q=querry(-v[i].b);
if(q.a+1>m) {
m=q.a+1;
mpoz=-v[i].b;
}
p[-v[i].b]=q.b;
update(-v[i].b,q.a+1,-v[i].b);
}
so<<m<<'\n';
n=m;
for(m=0;n--;mpoz=p[mpoz],m++)
sol[m]=r[mpoz];
while(m--)
so<<sol[m]<<' ';
so.close();
return 0;
}