Pagini recente » Cod sursa (job #2577247) | Cod sursa (job #3246718) | Cod sursa (job #2389538) | Cod sursa (job #2880287) | Cod sursa (job #2466293)
//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;
}