Pagini recente » Cod sursa (job #1673046) | Cod sursa (job #677216) | Cod sursa (job #658589) | Cod sursa (job #2727318) | Cod sursa (job #2186851)
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
vector <int> st[100001];
vector <int> dr[100001];
struct ura {int h, poz;};
ura stiva [100001];
int st1[100001], st2[100001], dr1[100001], dr2[100001], v[100001];
int cautare (int x, int vf) {
int st, dr, mij, retin = 0;
st = 1;
dr = vf;
while (st <= dr) { /// stiva[st] >= x > stiva[dr]
mij = (st + dr) / 2;
if (stiva[mij].h > x) {
retin = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
/*
///invariant: stiva[st].h >= x > stiva[dr].h
stiva[vf + 1].h = 0;
st = 0;
dr = vf + 1;
while (st < dr - 1) {
mij = (st + dr) / 2;
if()
}
*/
return retin;
}
int main() {
stiva[0].h = 2000000000;
freopen ("turnuri4.in", "r", stdin);
freopen ("turnuri4.out", "w", stdout);
int n, i, vf, k;
long long coeficient, coef;
scanf ("%d", &n);
for (i = 1; i <= n; i++)
scanf ("%d", &v[i]);
vf = 0;
for (i = 1; i <= n; i++) {
while (vf > 0 && stiva[vf].h < v[i])
vf--;
st1[i] = stiva[vf].poz;
vf++;
stiva[vf].h = v[i];
stiva[vf].poz = i;
}
vf = 0;
stiva[0].poz = n + 1;
for (i = n; i >= 1; i--) {
while (vf > 0 && stiva[vf].h < v[i])
vf--;
dr1[i] = stiva[vf].poz;
vf++;
stiva[vf].h = v[i];
stiva[vf].poz = i;
}
for (i = 0; i <= n + 1; i++) {
st[st1[i]].push_back(i);
dr[dr1[i]].push_back(i);
}
stiva[0].poz = 0;
vf = 0;
for (i = 1; i <= n; i++) {
for (k = 0; k < st[i].size(); k++)
st2[st[i][k]] = stiva[cautare (v[st[i][k]], vf)].poz;
while (vf > 0 && stiva[vf].h < v[i])
vf--;
st1[i] = stiva[vf].poz;
vf++;
stiva[vf].h = v[i];
stiva[vf].poz = i;
}
stiva[0].poz = n + 1;
vf = 0;
for (i = n; i >= 1; i--) {
for (k = 0; k < dr[i].size(); k++)
dr2[dr[i][k]] = stiva[cautare (v[dr[i][k]], vf)].poz;
while (vf > 0 && stiva[vf].h < v[i])
vf--;
dr1[i] = stiva[vf].poz;
vf++;
stiva[vf].h = v[i];
stiva[vf].poz = i;
}
for (i = 1; i <= n; i++)
if (dr2[i] == 0)
dr2[i] = n + 1;
coeficient = 0;
for (i = 1; i <= n; i++)
coeficient += dr1[i] - st1[i] - 1;
//for(i=1;i<=n;i++)
// printf("%d %d\n",st2[i], dr2[i]);
for (i = 1; i <= n; i++) {
coef = coeficient - (dr1[i] - st1[i] - 2);
for (k = 0; k < st[i].size(); k++)
coef += st1[st[i][k]] - st2[st[i][k]];
for (k = 0; k < dr[i].size(); k++)
coef += dr2[dr[i][k]] - dr1[dr[i][k]];
printf ("%lld\n", coef);
}
return 0;
}