Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define Woody
- #define int long long
- #define lowbit(x) (x&-x)
- #define rep(n) for(int i=0;i<n;i++)
- #define mp make_pair
- #define eb emplace_back
- #define F first
- #define S second
- #define SZ(a) (int)(a.size())
- #define all(v) v.begin(),v.end()
- #define SETIO(s) ifstream cin(s+".in");ofstream cout(s+".out");
- #ifdef Woody
- #define quick ios::sync_with_stdio(0);cin.tie(0);
- #else
- #define quick
- #endif
- #define INF INT64_MAX
- using namespace std;
- typedef pair<int,int> pii;
- int k;
- stack<int> s1;
- stack<int> Max1;
- stack<int> Max2;
- stack<int> Min1;
- stack<int> Min2;
- void add(int x){
- if(!Max1.size()){
- Max1.push(x);
- Min1.push(x);
- s1.push(x);
- }
- else{
- Max1.push(max(Max1.top(),x));
- Min1.push(min(Min1.top(),x));
- s1.push(x);
- }
- }
- void del(){
- if(!Max2.size()){
- while(s1.size()){
- if(!Max2.size())Max2.push(s1.top()),Min2.push(s1.top());
- else Max2.push(max(Max2.top(),s1.top())),Min2.push(min(Min2.top(),s1.top()));
- s1.pop();
- Max1.pop();
- Min1.pop();
- }
- }
- Max2.pop();
- Min2.pop();
- }
- bool ok(){
- if(!Max1.size()){
- if(Max2.size())return Max2.top()-Min2.top()<=k;
- return true ;
- }
- if(!Max2.size()) return Max1.top()-Min1.top()<=k;
- return max(Max1.top(),Max2.top())-min(Min1.top(),Min2.top())<=k;
- }
- void reset(){
- s1=stack<int>();
- Max1=stack<int>();
- Max2=stack<int>();
- Min1=stack<int>();
- Min2=stack<int>();
- }
- signed main(){
- quick
- int n;
- cin>>n>>k;
- vector<int> v(n);
- int x;
- rep(n){
- cin>>v[i];
- }
- vector<int> ans;
- vector<int> ans2;
- vector<int> sum;
- ans.assign(n,0);
- ans2.assign(n,0);
- sum.assign(n,0);
- int l=0;
- int num=0;
- int n2=0;
- for(int i=0;i<n;i++){
- add(v[i]);
- while(l<i&&!ok()){
- l++;
- del();
- }
- if(ok()){
- num+=(i-l+1);
- n2+=l;
- sum[i]=num;
- ans[i]=l;
- ans2[i]=n2;
- }
- }
- // for(int i:ans) cout<<i<<" ";cout<<"\n";
- int q;cin>>q;
- rep(q){
- int r;
- cin>>l>>r;
- l--;
- r--;
- int minus=0;
- if(l)minus=sum[l-1];
- int p=lower_bound(ans.begin()+l,ans.begin()+r+1,l)-ans.begin()-1;
- if(p>=l){
- int r2=0;
- if(l) r2=ans2[l-1];
- minus+=l*(p-l+1)-(ans2[p]-r2);
- // cout<<ans2[p]<<" "<<r2<<"\n";
- }
- cout<<sum[r]-minus<<"\n";
- }
- }
Add Comment
Please, Sign In to add comment