bingxuan9112

Untitled

Feb 9th, 2020
509
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. //   __________________
  2. //  | ________________ |
  3. //  ||          ____  ||
  4. //  ||   /\    |      ||
  5. //  ||  /__\   |      ||
  6. //  || /    \  |____  ||
  7. //  ||________________||
  8. //  |__________________|
  9. //  \\#################\\
  10. //   \\#################\\
  11. //    \        ____       \
  12. //     \_______\___\_______\
  13. // An AC a day keeps the doctor away.
  14.  
  15. #pragma GCC optimize("Ofast")
  16. #pragma loop_opt(on)
  17. #include <bits/stdc++.h>
  18. #define debug(x) 1&&(cout<<#x<<':'<<(x)<<'\n')
  19. #define pb emplace_back
  20. #define ff first
  21. #define ss second
  22. #define siz(v) (ll(v.size()))
  23. #define all(v) begin(v),end(v)
  24. #define REP(i,l,r) for(int i=(l);i<(r);i++)
  25. #define mid (l+(r-l>>1))
  26. #define int ll
  27. #define get_pos(v,x) (lower_bound(all(v),x)-begin(v))
  28.  
  29. using namespace std;
  30. typedef long long ll;
  31. typedef long double ld;
  32. typedef pair<ll,ll> pll;
  33. constexpr long double PI = acos(-1),eps = 1e-8;
  34. constexpr ll N = 100500, INF = 1e18, MOD = 1000000007, K = 300;
  35.  
  36. ll n,k,q,v[N],ans[N];
  37. vector<ll> u;
  38. ll res,nxt[N],prv[N],cnt[N*8];
  39. struct Query{
  40.     int l,r,id,blk;
  41.     bool operator<(const Query &rhs) const {return blk != rhs.blk ? blk<rhs.blk : (r>rhs.r)^(blk&1);}
  42. } Q[N];
  43. inline void addl(ll x){
  44.     if(x > N) exit(0);
  45.     if(~nxt[x]) res += cnt[nxt[x]];
  46.     cnt[x]++;
  47. }
  48. inline void addr(ll x){
  49.     if(x > N) exit(0);
  50.     if(~prv[x]) res += cnt[prv[x]];
  51.     cnt[x]++;
  52. }
  53. inline void subl(ll x){
  54.     if(x > N) exit(0);
  55.     --cnt[x];
  56.     if(~nxt[x]) res -= cnt[nxt[x]];
  57. }
  58. inline void subr(ll x){
  59.     if(x > N) exit(0);
  60.     --cnt[x];
  61.     if(~prv[x]) res -= cnt[prv[x]];
  62. }
  63. signed main(){
  64.     ios_base::sync_with_stdio(0), cin.tie(0);
  65.     cin >> n >> k;
  66.     for(int i = 1; i <= n; i++) cin >> v[i];
  67.     for(int i = 1, x; i <= n; i++) {
  68.         cin >> x;
  69.         v[i] = v[i]==1 ? x : -x;
  70.     }
  71.     for(int i = 1; i <= n; i++) v[i] += v[i-1];
  72.     for(int i = 0; i <= n; i++) u.pb(v[i]);
  73.     sort(all(u)), u.erase(unique(all(u)),u.end());
  74.     for(int i = 0; i <= n; i++) v[i] = get_pos(u,v[i]);
  75.     memset(nxt,-1,sizeof nxt), memset(prv,-1,sizeof prv);
  76.     if(u.size() > N) return 0;
  77.     for(int i = 0, id; i < u.size(); i++) {
  78.         id = get_pos(u,u[i]+k);
  79.         if(id < u.size() && u[id] == u[i]+k) nxt[i] = id;
  80.         id = get_pos(u,u[i]-k);
  81.         if(id < u.size() && u[id] == u[i]-k) prv[i] = id;
  82.     }
  83.     cin >> q;
  84.     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;
  85.     sort(Q,Q+q);
  86.     int l = 0, r = -1;
  87.     for(int i = 0; i < q; i++) {
  88.         while(l>Q[i].l) addl(v[--l]);
  89.         while(r<Q[i].r) addr(v[++r]);
  90.         while(l<Q[i].l) subl(v[l++]);
  91.         while(r>Q[i].r) subr(v[r--]);
  92.         ans[Q[i].id] = res;
  93.     }
  94.     for(int i = 0; i < q; i++) cout << ans[i] << '\n';
  95. }
Advertisement
Add Comment
Please, Sign In to add comment