제출 #1312548

#제출 시각아이디문제언어결과실행 시간메모리
1312548samarthkulkarniPilot (NOI19_pilot)C++20
100 / 100
360 ms61844 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
#define vi vector<long long>
#define all(x) x.begin(), x.end()
#define endl "\n"
#define pr pair<ll, ll>
#define ff first
#define ss second

void solution();
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solution();
    return 0;
}

const int N = 1e6+10;
ll a[N];
ll cnt[N];
ll h[N];
ll nw[N];

struct JohnWick{

    void update(int i, ll val) {
        for (; i < N; i += i & (-i)) h[i] += val;
    }
    ll query(int i) {
        ll ans = 0;
        for (; i > 0; i -= i & (-i)) ans += h[i];
        return ans; 
    }
};

struct JohnWick2{

    void update(int i, ll val) {
        for (; i < N; i += i & (-i)) nw[i] += val;
    }
    ll query(int i, int j) {
        ll ans = 0;
        i--;
        for (; j > 0; j -= j & (-j)) ans += nw[j];
        for (; i > 0; i -= i & (-i)) ans -= nw[i];
        return ans; 
    }
};


void solution() {
    ll n, q; cin >> n >> q;

    vi temp(n);
    for (int i = 0; i < n; i++) cin >> temp[i];

    int id = 0;
    for (auto val : temp) {
        if (a[id] != val) a[++id] = val;
        cnt[id]++;
    } 
    n = id;

    vi prev(n+1), nxt(n+1);
    a[0] = 1e18;
    a[n+1] = 1e18;

    stack<ll> hs;
    hs.push(0);
    for (int i = 1; i <= n; i++) {
        while (a[hs.top()] < a[i]) hs.pop();
        prev[i] = hs.top();
        hs.push(i);
    }
    while (!hs.empty()) hs.pop();

    hs.push(n+1);
    for (int i = n; i >= 1; i--) {
        while (a[hs.top()] <= a[i]) hs.pop();
        nxt[i] = hs.top();
        hs.push(i);
    }




    JohnWick m;
    JohnWick2 k;

    for (int i = 1; i <= n; i++) k.update(i, cnt[i]);
    auto val = [&](int i) {

        ll l = k.query(prev[i]+1, i-1);
        ll r = k.query(i+1, nxt[i]-1);


        return l*r + l*cnt[i] + r*cnt[i] + cnt[i]*(cnt[i]+1)/2;
    };  

    for (int i = 1; i <= n; i++) {
        m.update(a[i], val(i));
    }

    while (q--) {
        ll x; cin >> x;
        cout << m.query(x) << endl;
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...