Cod sursa(job #802456)

Utilizator andunhillMacarescu Sebastian andunhill Data 26 octombrie 2012 18:56:40
Problema Subsir crescator maximal Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#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;
}