1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #include <bits/stdc++.h> using namespace std;
typedef long long ll; #define rep(i,a,n) for (ll i=a;i<n;i++) #define per(i,a,n) for (ll i=n-1;i>=a;i--) #define pb push_back #define lowbit(x) ((x)&(-x)) #define MAXN 300010 ll n,q,k; ll a[MAXN];
void add(vector<ll>&arr,ll x,ll y) { for(; x <= n; x += lowbit(x)){ arr[x] += y; } } ll sum(vector<ll>&arr,ll x) { ll ans = 0; for(; x > 0; x -= lowbit(x)){ ans += arr[x]; } return ans; } ll sto(vector<ll>&arr,ll l,ll r) { return sum(arr,r) - sum(arr,l-1); }
vector<ll>v[MAXN];
struct ask { ll l,r,i; }w[MAXN];
ll ans[MAXN];
bool cmp(ask a,ask b) { return a.r > b.r; }
void solve(ll k,ll pw) { priority_queue< pair<ll,ll>,vector<pair<ll,ll>>, greater<pair<ll,ll>> >p; rep(i,1,n+1){ if(v[i].size() >= k){ p.push({v[i][k-1],i}); } } vector<ll> cnt(MAXN,0); vector<ll>l2r(MAXN,0); vector< vector<ll> > r2l(MAXN,vector<ll>()); rep(i,1,n+1){ while(!p.empty() && ( cnt[p.top().second] + k-1 >= v[p.top().second].size() || v[p.top().second][cnt[p.top().second] + k-1] != p.top().first )){ p.pop(); } cnt[a[i]] ++; if(v[a[i]].size() > cnt[a[i]]+k-1){ p.push({v[a[i]][cnt[a[i]]+k-1],a[i]}); } l2r[i] = p.empty()?n:(p.top().first - 1); r2l[l2r[i]].pb(i); }
vector<ll>s(MAXN,0); rep(i,1,n+1){ s[i] = s[i-1] + l2r[i]-i+1; } vector<vector<ll> >tr(2, vector<ll>(MAXN,0)); ll nn = 0; per(i,1,n+1){ while(w[nn].r >= i && nn < q) { ans[w[nn].i] += pw*( (s[w[nn].r] - s[w[nn].l-1]) +sto(tr[0],w[nn].l,w[nn].r)+w[nn].r*sto(tr[1],w[nn].l,w[nn].r) ); nn ++; } rep(j,0,r2l[i].size()){ ll xay = r2l[i][j]; add(tr[0],xay,-i); add(tr[1],xay,1); } } }
int main() { scanf("%lld %lld %lld",&n,&q,&k); rep(i,1,n+1){ cin >> a[i]; v[a[i]].pb(i); } rep(i,0,q){ scanf("%lld %lld",&w[i].l,&w[i].r); w[i].i = i; } sort(w,w+q,cmp);
solve(k+1,1); if(k != 1){ solve(k,-1); } rep(i,0,q){ printf("%lld\n",ans[i]); } return 0; }
|