Cod sursa(job #2008090)

Utilizator Y0da1NUME JMECHER Y0da1 Data 5 august 2017 12:11:26
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.71 kb
#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;
}