Pagini recente » Cod sursa (job #1777498) | Cod sursa (job #190429) | Cod sursa (job #2899004) | Cod sursa (job #1732117) | Cod sursa (job #802456)
Cod sursa(job #802456)
#include<fstream>
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
clock_t start=clock();
ifstream f("scmax.in");
ofstream g("scmax.out");
int N;
pair<int, int>sir[100001];
int norm[100001];
int ex[100001];
int aib[100001];
void update(int idx, int i)
{ while(idx <= N)
{ if(sir[aib[idx]].first < sir[i].first)
aib[idx] = i;
idx += (idx & -idx);
}
}
int query(int idx)
{ int ans = 0;
while(idx)
{ if(sir[ans].first < sir[aib[idx]].first)
ans = aib[idx];
idx -= (idx & -idx);
}
return ans;
}
void afis(int p)
{ if(!p) return;
afis(sir[p].second);
g<<ex[sir[p].first]<<" ";
}
int main()
{ int i, j;
int p = 0;
f>>N;
for(i = 1; i <= N; i++)
{ f>>sir[i].first; norm[i] = sir[i].first;
sir[i].second = i;
}
sort(sir + 1, sir + N + 1);
i = 1; j = 0;
while(i <= N)
{ if(sir[i].first != sir[i - 1].first) j++;
ex[j] = norm[sir[i].second];
norm[sir[i].second] = j;
i++;
}
for(i = 1; i <= N; i++)
{ j = query(norm[i]);
sir[i].first = sir[j].first + 1;
sir[i].second = j;
update(norm[i] + 1, i);
if(sir[i] > sir[p])
p = i;
}
g<<sir[p].first<<'\n';
afis(p);
cout << 1.0*(clock()-start)/(1.0*CLOCKS_PER_SEC) << '\n';
return 0;
}