Pagini recente » Cod sursa (job #1312050) | Cod sursa (job #414712) | Cod sursa (job #2177157) | Cod sursa (job #1201137) | Cod sursa (job #1655445)
#include <fstream>
#include <numeric>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
ifstream f("psir.in");
ofstream g("psir.out");
int n;
f >> n;
vector<int> v(n);
for(auto& x : v){
f >> x; }
vector<vector<unsigned int>> d(n, vector<unsigned int>(n, 1));
auto cmp = [&](const int a, const int b){
return v[a] < v[b]; };
vector<int> left, right(n-1);
iota(right.begin(), right.end(), 1);
sort(right.begin(), right.end(), cmp);
for(int mij = 1; mij < n-1; ++mij){
left.insert(lower_bound(left.begin(), left.end(), mij-1, cmp), mij-1);
right.erase(find(right.begin(), right.end(), mij));
unsigned int tmp = 0;
for(int i = 0, j = 0; i < right.size() && v[right[i]] < v[mij]; ++i){
while(j < left.size() && v[left[j]] < v[right[i]]){
tmp += d[left[j]][mij];
++j; }
d[mij][right[i]] += tmp; }
tmp = 0;
for(int i = right.size()-1, j = left.size()-1; i >= 0 && v[right[i]] > v[mij]; --i){
while(j >= 0 && v[left[j]] > v[right[i]]){
tmp += d[left[j]][mij];
--j; }
d[mij][right[i]] += tmp; } }
unsigned int rez = 0;
for(int i = 0; i < n; ++i){
for(int j = i+1; j < n; ++j){
rez += d[i][j]; } }
g << rez;
return 0; }