Cod sursa(job #2186851)

Utilizator ioana.jianuIoana Jianu ioana.jianu Data 26 martie 2018 00:30:38
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#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;
}