Cod sursa(job #1040831)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 24 noiembrie 2013 23:00:18
Problema Secv Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

vector<int> srt;
vector<int> pos[5005];
int vals[5005], dp[5005], lst[5005];

int bs1(int x){
  int left = 0, right = srt.size() - 1, mid;
  while(left <= right){
    mid = (left + right) >> 1;
    if(srt[mid] == x)
      return mid;

    if(srt[mid] > x)
      right = mid - 1;
    else
      left = mid + 1;
  }
  return -1;
}

int main(){
  ifstream in("secv.in");
  ofstream out("secv.out");

  int n;
  set<int> vis;

  in >> n;

  for(int i = 1; i <= n; ++i){
    in >> vals[i];
    if(vis.find(vals[i]) == vis.end()){
      srt.push_back(vals[i]);
      vis.insert(vals[i]);
    }
  }

  sort(srt.begin(), srt.end());

  for(int i = 1; i <= n; ++i){
    vals[i] = bs1(vals[i]);
    pos[vals[i]].push_back(i);
  }

  int ans = -1;

  for(int i = 1; i <= n; ++i){
    if(vals[i] == 0){
      dp[i] = 1;
      lst[0] = i;
      continue;
    }

    int t = lst[vals[i] - 1];
    if(t == 0)
      continue;
    dp[i] = dp[t] + i - t;
    lst[vals[i]] = i;
    if(dp[i] && vals[i] == srt.size() - 1)
      ans = max(ans, dp[i]);
  }

  out << ans;

  return 0;
}