이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;
const int N = 3e5 + 7;
ll n, q, d;
ll c[N], ps[N], kol[N], res[N];
vector <pii> qu[N];
ll fen[2][N];
void add(int o, int x, ll val) {for (x++; x < N; x += x & -x) fen[o][x] += val;}
ll get(int o, int x) {ll out = 0; for (x++; x; x -= x & -x) out += fen[o][x]; return out;}
void update(int l, int r, ll val) {add(0, l, val); add(0, r+1, -val); add(1, l, val*l); add(1, r+1, -val*(r+1));}
ll query(int x) {return get(0, x)*x-get(1, x);}
ll query(int l, int r) {return query(r+1)-query(l);}
int main () {
FIO;
cin >> n >> d;
for (int i = 0; i < n; i++) cin >> c[i];
for (int i = 1; i < n; i++) kol[i] = kol[i-1] + (c[i-1]%d > c[i]%d);
for (int i = 0; i < n; i++) {
ps[i+1] = ps[i] + c[i]/d;
c[i] = c[i]/d-kol[i];
}
cin >> q;
for (int i = 0; i < q; i++) {
int l, r; cin >> l >> r; l--; r--;
qu[r].pb({l, i});
}
stack <pii> st;
st.push({-1, (ll)-1e18});
for (int i = 0; i < n; i++) {
update(i, i, c[i]+kol[i]);
while (!st.empty() && st.top().S >= c[i]) {
ll x = st.top().F, y = st.top().S; st.pop();
update(st.top().F+1, x, c[i]-y);
}
st.push({i, c[i]});
for (auto x : qu[i]) res[x.S] = ((query(x.F, x.F) < 0) ? -1 : ps[i+1]-ps[x.F]-query(x.F, i));
}
for (int i = 0; i < q; i++) cout << res[i] << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |