Cod sursa(job #2466293)

Utilizator TheGodFather2131Alexandru Miclea TheGodFather2131 Data 1 octombrie 2019 20:44:12
Problema Hashuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
//ALEXANDRU MICLEA

#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <time.h>
#include <iomanip>
#include <deque>
#include <math.h>
#include <cmath>
#include <assert.h>
#include <stack>
#include <bitset>
#include <random>
#include <chrono>

using namespace std;

#include <fstream>
ifstream cin("turnuri4.in"); ofstream cout("turnuri4.out");
int n, v[100005];
long long ans = 0;
int st1[100005], st2[100005];
int dr1[100005], dr2[100005];
vector <int> ST[100005], DR[100005], aux;
stack <int> s1, s2;



void strabunica(int vec1[], int vec2[], int i) {
	
	while (v[s2.top()] <= v[i]) {
		vec2[s2.top()] = i;
		s2.pop();
	}
	while (v[s1.top()] <= v[i]) {
		vec1[s1.top()] = i;
		aux.push_back(s1.top());
		s1.pop();
	}

	reverse(aux.begin(), aux.end());

	for (auto& x : aux) {
		s2.push(x);
	}
	aux.clear();

	s1.push(i);
}

void rezolvare() {
	for (int i = 1; i <= n; i++) {
		ans += 1LL * (dr1[i] - st1[i] - 1);
		ST[st1[i]].push_back(i);
		DR[dr1[i]].push_back(i);
	}

	for (int i = 1; i <= n; i++) {
		long long now = 1LL * (st1[i] - dr1[i] + 2);
		for (auto& x : ST[i]) {
			now += (st1[x] - st2[x]);
		}
		for (auto& x : DR[i]) {
			now += (dr2[x] - dr1[x]);
		}
		cout << ans + now << '\n';
	}
}


int main() {

	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> v[i];
	}

	for (int i = 1; i <= n; i++) {
		st1[i] = st2[i] = 0;
		dr1[i] = dr2[i] = n + 1;
	}

	v[0] = 1e9;
	s1.push(0);
	s2.push(0);

	for (int i = n; i >= 1; i--) {
		strabunica(st1, st2, i);
	}

	while (s1.size() > 1) {
		s1.pop();
	}

	while (s2.size() > 1) {
		s2.pop();
	}
	for (int i = 1; i <= n; i++) {
		strabunica(dr1, dr2, i);
	}

	rezolvare();

	return 0;
}