#include<bits/stdc++.h>
using namespace std;
int pos[1][200005];
long long sum[1][200005];
int a[200005];
int n;
int q;
long long ans;
int main() {
cin >> n;
for(int i = 1;i <= n;i++)
cin >> a[i];
int j = 1;
for(int i = 1;i <= n;i++)
{
pos[0][i] = pos[0][i - 1];
while(j <= n && pos[0][i] - i + 1 <= a[j])
pos[0][i] = ++j;
sum[0][i] = sum[0][i - 1] + pos[0][i];
ans += pos[0][i] - i;
}
j = 1;
for(int i = 1;i <= n;i++)
{
cout << i << " "<< a[1] << " " << a[2] << " " << a[3] << " " << a[4] << " " << a[5] << endl;
j = min(n + 1, pos[0][i] + 1);
pos[1][i] = j;
while(j <= n && pos[1][i] - i + 1 <= a[j])
pos[1][i] = ++j;
sum[1][i] = sum[1][i - 1] + pos[1][i];
}
cin >> q;
while(q--) {
int p, x;
cin >> p >> x;
//cout << a[1] << " " << a[2] << " " << a[3] << " " << a[4] << endl;
cout << "[" << p << " " << a[p] << "]\n";
if(x < a[p])
{
int l = 1, r = n, mid, p1 = n, p2 = n;
while(l <= r)
{
mid = (l + r) >> 1;
if(pos[0][mid] > p) p1 = mid, r = mid - 1;
else l = mid + 1;
}
p2 = p - x;
if(p1 > p2)
{
cout << "qwq1\n";
cout << ans << endl;
continue;
}
long long tmp = sum[0][p2] - sum[0][p1 - 1];
cout << ans - tmp + p * (p2 - p1 + 1) << endl;
cout << "qwq2\n";
}
else if(x > a[p])
{
int l = 1, r = n, mid, p1 = n, p2 = 0;
while(l <= r)
{
mid = (l + r) >> 1;
if(pos[0][mid] <= p) p2 = mid, l = mid + 1;
else r = mid - 1;
}
l = 1, r = p2;
while(l <= r)
{
mid = (l + r) >> 1;
if(pos[0][mid] == p) p1 = mid, r = mid - 1;
else l = mid + 1;
}
p1 = max(p1, 1 - (x - p));
if(p1 > p2)
{
cout << ans << endl;
cout << "qwq3\n";
continue;
}
long long tmp = sum[1][p2] - sum[1][p1 - 1];
cout << ans - p * (p2 - p1 + 1) + tmp << endl;
cout << "qwq4\n";
}
else
cout << ans << endl;
}
return 0;
}
输入
4
2 4 1 4
3
2 4
3 3
2 1
结果
5
1 1 3 2 1
1 1 1 3 2 1
2 1 1 3 2 1
3 1 1 3 2 1
4 0 1 3 2 1
5 0 21 0 2 1
3
1 3
[1 0]
7
qwq3
2 5
[2 21]
qwq1
7
4 5
[4 27]
qwq1
7
我想知道为什么a数组值会变啊