Pagini recente » Monitorul de evaluare | Diferente pentru runda/redsnow_1 intre reviziile 29 si 28 | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2008090)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
//24 12 15 15 19
using namespace std;
int n;
vector<pair<int, int> > a (100002);
int d[100002], aib[100002], ans[100002], orig[100002];
char fisier [3000002], c;
void update (int pos, int val)
{
for(; pos <=n; pos+=pos&-pos)
if(val>aib[pos])
aib[pos]=val;
}
int query(int pos)
{
int curr = pos+1;
int maxim = 0;
for(;pos>0; pos-=pos&-pos)
if(aib[pos] > maxim)
{
maxim=aib[pos];
//prv[curr] = pos;
}
return maxim;
}
bool criteriu (const pair<int, int> a, const pair <int, int> b)
{
if(a.first==b.first)
return a.second > b.second;
return a.first < b.first;
}
int main()
{
int maxim=0, curr, j=0, nr=0, cnt=1;
ifstream in ("scmax.in");
ofstream out ("scmax.out");
//ofstream debug ("out.txt");
pair <int, int> temp;
//parsam plm
in.read(fisier, 3000000);
while (c!='\n')
{
c=fisier[j];
if('0'<=c && c<='9')
{
n*=10;
n+=(c-'0');
}
++j;
}
while(fisier[j]>'9' || fisier[j]<'0')
++j;
while(c!=0)
{
c=fisier[j];
if('0' <= c && c <='9')
{
nr*=10;
nr+= (c - '0');
++j;
}
else
{
if(j==3000000 && !in.eof())
{
j=0;
c=fisier[j];
in.read(fisier, 3000000);
}
else
{
temp.first=nr;
orig[cnt]=nr;
temp.second=cnt;
a[cnt]=temp;
++cnt;
++j;
nr=0;
}
}
}
//cout<<"GATA PARSAREA!";
//debug<<n<<"\n";
/*for(int i=1;i<=n;++i)
debug<<"("<<a[i].first<<","<<a[i].second<<") ";
debug<<endl;*/
//in>>n;
/*for(int i=1;i<=n;++i)
{
in>>temp.first;
orig[i]=temp.first;
temp.second=i;
a[i]=temp;
//a.push_back(temp);
}*/
sort(a.begin()+1, a.begin()+n+1, criteriu);
for(int i=1;i<=n;++i)
{
d[a[i].second]=query(a[i].second -1) + 1;
update(a[i].second, d[a[i].second]);
}
for(int i=n;i;--i)
if(maxim<d[i])
{
maxim=d[i];
curr=i;
}
j=2;
ans[1]=orig[curr];
for(int i=curr-1;i;--i)
if(d[i]==d[curr]-1)
{
ans[j]=orig[i];
curr=i;
++j;
}
out<<maxim<<"\n";
for(int i=maxim;i;--i)
out<<ans[i]<<" ";
return 0;
}