yuhung94

Untitled

Aug 27th, 2021
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define Woody
  3. #define int long long
  4. #define lowbit(x) (x&-x)
  5. #define rep(n) for(int i=0;i<n;i++)
  6. #define mp make_pair
  7. #define eb emplace_back
  8. #define F first
  9. #define S second
  10. #define SZ(a) (int)(a.size())
  11. #define all(v) v.begin(),v.end()
  12. #define SETIO(s) ifstream cin(s+".in");ofstream cout(s+".out");
  13. #ifdef Woody
  14. #define quick ios::sync_with_stdio(0);cin.tie(0);
  15. #else
  16. #define quick
  17. #endif
  18. #define INF INT64_MAX
  19. using namespace std;
  20. typedef pair<int,int> pii;
  21. int k;
  22. stack<int> s1;
  23. stack<int> Max1;
  24. stack<int> Max2;
  25. stack<int> Min1;
  26. stack<int> Min2;
  27. void add(int x){
  28.     if(!Max1.size()){
  29.         Max1.push(x);
  30.         Min1.push(x);
  31.         s1.push(x);
  32.     }
  33.     else{
  34.         Max1.push(max(Max1.top(),x));
  35.         Min1.push(min(Min1.top(),x));
  36.         s1.push(x);
  37.     }
  38. }
  39. void del(){
  40.     if(!Max2.size()){
  41.         while(s1.size()){
  42.             if(!Max2.size())Max2.push(s1.top()),Min2.push(s1.top());
  43.             else Max2.push(max(Max2.top(),s1.top())),Min2.push(min(Min2.top(),s1.top()));
  44.             s1.pop();
  45.             Max1.pop();
  46.             Min1.pop();
  47.         }
  48.     }
  49.     Max2.pop();
  50.     Min2.pop();
  51. }
  52. bool ok(){
  53.     if(!Max1.size()){
  54.         if(Max2.size())return Max2.top()-Min2.top()<=k;
  55.         return true ;
  56.     }
  57.     if(!Max2.size()) return Max1.top()-Min1.top()<=k;
  58.     return max(Max1.top(),Max2.top())-min(Min1.top(),Min2.top())<=k;
  59. }
  60. void reset(){
  61.     s1=stack<int>();
  62.     Max1=stack<int>();
  63.     Max2=stack<int>();
  64.     Min1=stack<int>();
  65.     Min2=stack<int>();
  66. }
  67. signed main(){
  68.     quick
  69.     int n;
  70.     cin>>n>>k;
  71.     vector<int> v(n);
  72.     int x;
  73.     rep(n){
  74.         cin>>v[i];
  75.     }
  76.     vector<int> ans;
  77.     vector<int> ans2;
  78.     vector<int> sum;
  79.     ans.assign(n,0);
  80.     ans2.assign(n,0);
  81.     sum.assign(n,0);
  82.     int l=0;
  83.     int num=0;
  84.     int n2=0;
  85.     for(int i=0;i<n;i++){
  86.         add(v[i]);
  87.         while(l<i&&!ok()){
  88.             l++;
  89.             del();
  90.         }
  91.         if(ok()){
  92.             num+=(i-l+1);
  93.             n2+=l;
  94.             sum[i]=num;
  95.             ans[i]=l;
  96.             ans2[i]=n2;
  97.            
  98.         }
  99.     }
  100. //  for(int i:ans) cout<<i<<" ";cout<<"\n";
  101.     int q;cin>>q;
  102.     rep(q){
  103.         int r;
  104.         cin>>l>>r;
  105.         l--;
  106.         r--;
  107.         int minus=0;
  108.         if(l)minus=sum[l-1];
  109.         int p=lower_bound(ans.begin()+l,ans.begin()+r+1,l)-ans.begin()-1;
  110.         if(p>=l){
  111.             int r2=0;
  112.             if(l) r2=ans2[l-1];
  113.             minus+=l*(p-l+1)-(ans2[p]-r2);
  114.         //  cout<<ans2[p]<<" "<<r2<<"\n";
  115.         }
  116.         cout<<sum[r]-minus<<"\n";
  117.     }
  118.    
  119. }
Add Comment
Please, Sign In to add comment