Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // __________________
- // | ________________ |
- // || ____ ||
- // || /\ | ||
- // || /__\ | ||
- // || / \ |____ ||
- // ||________________||
- // |__________________|
- // \\#################\\
- // \\#################\\
- // \ ____ \
- // \_______\___\_______\
- // An AC a day keeps the doctor away.
- #pragma GCC optimize("Ofast")
- #pragma loop_opt(on)
- #include <bits/stdc++.h>
- #define debug(x) 1&&(cout<<#x<<':'<<(x)<<'\n')
- #define pb emplace_back
- #define ff first
- #define ss second
- #define siz(v) (ll(v.size()))
- #define all(v) begin(v),end(v)
- #define REP(i,l,r) for(int i=(l);i<(r);i++)
- #define mid (l+(r-l>>1))
- #define int ll
- #define get_pos(v,x) (lower_bound(all(v),x)-begin(v))
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- typedef pair<ll,ll> pll;
- constexpr long double PI = acos(-1),eps = 1e-8;
- constexpr ll N = 100500, INF = 1e18, MOD = 1000000007, K = 300;
- ll n,k,q,v[N],ans[N];
- vector<ll> u;
- ll res,nxt[N],prv[N],cnt[N*8];
- struct Query{
- int l,r,id,blk;
- bool operator<(const Query &rhs) const {return blk != rhs.blk ? blk<rhs.blk : (r>rhs.r)^(blk&1);}
- } Q[N];
- inline void addl(ll x){
- if(x > N) exit(0);
- if(~nxt[x]) res += cnt[nxt[x]];
- cnt[x]++;
- }
- inline void addr(ll x){
- if(x > N) exit(0);
- if(~prv[x]) res += cnt[prv[x]];
- cnt[x]++;
- }
- inline void subl(ll x){
- if(x > N) exit(0);
- --cnt[x];
- if(~nxt[x]) res -= cnt[nxt[x]];
- }
- inline void subr(ll x){
- if(x > N) exit(0);
- --cnt[x];
- if(~prv[x]) res -= cnt[prv[x]];
- }
- signed main(){
- ios_base::sync_with_stdio(0), cin.tie(0);
- cin >> n >> k;
- for(int i = 1; i <= n; i++) cin >> v[i];
- for(int i = 1, x; i <= n; i++) {
- cin >> x;
- v[i] = v[i]==1 ? x : -x;
- }
- for(int i = 1; i <= n; i++) v[i] += v[i-1];
- for(int i = 0; i <= n; i++) u.pb(v[i]);
- sort(all(u)), u.erase(unique(all(u)),u.end());
- for(int i = 0; i <= n; i++) v[i] = get_pos(u,v[i]);
- memset(nxt,-1,sizeof nxt), memset(prv,-1,sizeof prv);
- if(u.size() > N) return 0;
- for(int i = 0, id; i < u.size(); i++) {
- id = get_pos(u,u[i]+k);
- if(id < u.size() && u[id] == u[i]+k) nxt[i] = id;
- id = get_pos(u,u[i]-k);
- if(id < u.size() && u[id] == u[i]-k) prv[i] = id;
- }
- cin >> q;
- for(int i = 0; i < q; i++) cin >> Q[i].l >> Q[i].r, Q[i].id = i, Q[i].blk = --Q[i].l/K;
- sort(Q,Q+q);
- int l = 0, r = -1;
- for(int i = 0; i < q; i++) {
- while(l>Q[i].l) addl(v[--l]);
- while(r<Q[i].r) addr(v[++r]);
- while(l<Q[i].l) subl(v[l++]);
- while(r>Q[i].r) subr(v[r--]);
- ans[Q[i].id] = res;
- }
- for(int i = 0; i < q; i++) cout << ans[i] << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment