Untitled
By: a guest | Mar 21st, 2010 | Syntax:
C++ | Size: 1.56 KB | Hits: 47 | Expires: Never
#include <iostream>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
#include <list>
#include <deque>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <utility>
#include <sstream>
#include <cstring>
using namespace std;
#define FALL(ii,vv) for (int (ii)=0; (ii)<(vv).size();(ii)++)
#define REP(i,b) for(int (i)=(0);(i)<(b);(i)++)
#define FUP(i,a,b) for(int (i)=(a); (i)<=(b); (i)++)
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
typedef vector<int> vi;
typedef long long ll;
int n,t[1000010];
pair<int,int> kol[1000010];
set<int> s;
map<int,int> M;
void dodaj(int a){ s.insert(a); }
void update(int a){
if (s.size()==0){
M[1<<30]++;
return ;
}
set<int>::iterator it;
//maxx
int gora;
it = s.upper_bound(a);
if (it == s.end()) it=s.begin();
gora = (*it);
M[gora]++;
}
long long f(long long n){
n+=min(2,int(s.size()));
printf("F %lld\n",n);
return (ll)n*(n-1)/2-(s.size()>=2?1:0);
}
int main(){
s.clear();
scanf("%d",&n);
REP(i,n) scanf("%d",&t[i]);
REP(i,n){ kol[i].first = t[i]; kol[i].second = i; }
sort(kol,kol+n);
reverse(kol,kol+n);
kol[n].first = -1;
int i=0,j=0;
long long res = 0;
while(i<n){
M.clear();
while(kol[i].first==kol[j].first) update(kol[i++].second);
for(map<int,int>::iterator it = M.begin(); it!=M.end(); it++)
res += f(it->second);
while(i!=j) dodaj(kol[j++].second);
}
printf("%lld\n",res);
return 0;
}