Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // tera peecha karu to rokne ka nahi
- #include "bits/stdc++.h"
- using namespace std;
- typedef long long ll;
- const int MAX = 1e5 + 10;
- int a[MAX];
- template <class T> struct SparseTable {
- int n, logn;
- vector <int> log; vector <vector <T>> dp;
- SparseTable(int _n) {
- n = _n; logn = ceil(log2(n)) + 1;
- log.assign(n + 1, 0); dp.assign(logn, vector <T> (n));
- }
- T comb(T a, T b) { return {max(a.first, b.first), min(a.second, b.second)}; }
- void build() {
- log[1] = 0;
- for(int i = 0; i <= n; i ++) {
- if(i > 1) log[i] = log[i / 2] + 1;
- if(i < n) dp[0][i] = {a[i], a[i]};
- }
- for(int j = 1; j < logn; j ++) {
- for(int i = 0; i + (1 << j) <= n; i ++) {
- dp[j][i] = comb(dp[j - 1][i], dp[j - 1][i + (1 << (j - 1))]);
- }
- }
- }
- T query(int l, int r) {
- int ln = log[r - l + 1];
- return comb(dp[ln][l], dp[ln][r - (1 << ln) + 1]);
- }
- };
- int main() {
- ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
- int n, k;
- cin >> n >> k;
- SparseTable <pair <int, int>> ST(MAX);
- for(int i = 1; i <= n; i ++) cin >> a[i];
- ST.build();
- ll ans = 0;
- for(int i = 1; i <= n; i ++) {
- // number of egocentric subarrays starting at i
- int st = 0, en = 0;
- // find minimum index st such that a[i ... st] is egocentric
- int l = i, r = n + 1;
- while(r - l > 1) {
- int m = (l + r) / 2;
- auto qry = ST.query(i, m);
- if(qry.first - qry.second < k) l = m;
- else r = m;
- }
- st = r;
- auto qry = ST.query(i, st);
- if(st > n || qry.first - qry.second != k) continue;
- // find maximum index en such that a[i ... en] is egocentric
- l = i, r = n + 1;
- while(r - l > 1) {
- int m = (l + r) / 2;
- auto qry = ST.query(i, m);
- if(qry.first - qry.second <= k) l = m;
- else r = m;
- }
- en = l;
- ans += en - st + 1;
- }
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement