제출 #1222307

#제출 시각아이디문제언어결과실행 시간메모리
1222307noyancanturkFish 3 (JOI24_fish3)C++20
100 / 100
358 ms35164 KiB
#include<bits/stdc++.h>
using namespace std;

#define int int64_t
#define pb push_back

using pii=pair<int,int>;

const int lim=3e5+100;

struct fenw{
  int tree[lim];
  void update(int p,int val){
    p+=5;
    while(p<lim){
      tree[p]+=val;
      p+=p&-p;
    }
  }
  int query(int p){
    p+=5;
    int ans=0;
    while(p){
      ans+=tree[p];
      p-=p&-p;
    }
    return ans;
  }
  int query(int l,int r){
    return query(r)-query(l-1);
  }
};

struct{
  fenw con,speed;
  void update(int p,int val){
    if(p<0)return;
    speed.update(0,val);
    speed.update(p+1,-val);
    con.update(p+1,val*(p+1));
  }
  void update(int l,int r,int val){
    update(l-1,-val);
    update(r,val);
  }
  int query(int p){
    return con.query(p)+speed.query(p)*(p+1);
  }
  int query(int l,int r){
    return query(r)-query(l-1);
  }
}fw;

int n,d,q;
int a[lim],b[lim];
int l[lim],r[lim],ans[lim];
vector<int>g[lim];

int sub(int i,int j){
  i%=d;
  j%=d;
  if(j<=i)return i-j;
  return i-j+d;
}

signed main(){
  cin>>n>>d;
  for(int i=1;i<=n;i++){
    cin>>a[i];
  }
  cin>>q;
  for(int i=0;i<q;i++){
    cin>>l[i]>>r[i];
    g[r[i]].pb(i);
  }
  int L=1,curval=0;
  deque<int>st;
  for(int i=1;i<=n;i++){
    curval+=sub(a[i],a[i-1]);
    while(a[i]<curval){
      if(a[L]%d>a[L+1]%d){
        fw.update(L,i-1,1);
        curval-=d;
      }
      L++;
    }
    while(st.size()&&st.front()<L)st.pop_front();
    b[i]=(a[i]-curval)/d;
    fw.con.update(i,b[i]);
    while(st.size()&&b[i]<=b[st.back()]){
      int r=st.back();
      st.pop_back();
      int l=L;
      if(st.size())l=st.back()+1;
      fw.update(l,r,b[r]);
    }
    int ll=L;
    if(st.size())ll=st.back()+1;
    // for(int j=1;j<=i;j++){
    //   cerr<<fw.query(j,j)<<' ';
    // }cerr<<'\n';
    // cerr<<ll<<" huh\n";
    fw.update(ll,i,-b[i]);
    // for(int j=1;j<=i;j++){
    //   cerr<<fw.query(j,j)<<' ';
    // }cerr<<'\n';
    st.push_back(i);
    for(int j:g[i]){
      if(l[j]<L){
        ans[j]=-1;
      }else{
        ans[j]=fw.query(l[j],r[j]);
      }
    }
  }
  for(int i=0;i<q;i++){
    cout<<ans[i]<<'\n';
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...