我也不知道为什么就酱
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 100010;
int n, m, x0, da, db;
int a[N], k[N], x[N];
int f[18][N][2];
int ga[18][N][2];
int gb[18][N][2];
int ans;
double mn;
struct node
{
int id, h;
friend bool operator <(node a, node b)
{
return a.h < b.h;
}
};
multiset<node> s;
void calc (int s, int x)
{
int i = s;
da = db = 0;
for (int k = 17; k >= 0; k--)
{
if (f[k][i][0] && da + ga[k][i][0] + db + gb[k][i][0] <= x)
{
da += ga[k][i][0];
db += gb[k][i][0];
i = f[k][i][0];
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
cin >> x0 >> m;
for (int i = 1; i <= m; i++)
cin >> k[i] >> x[i];
a[0] = INT_MAX;
a[n + 1] = INT_MIN;
s.insert ({0, a[0]});
s.insert ({0, a[0]});
s.insert ({n + 1, a[n + 1]});
s.insert ({n + 1, a[n + 1]});
for (int i = n; i; i--)
{
int p, q;
node t = {i, a[i]};
s.insert (t);
auto it = s.lower_bound (t);
it--;
int lt = (*it).id;
int lh = (*it).h;
it++;
it++;
int nt = (*it).id;
int nh = (*it).h;
it--;
if (abs (nh - a[i]) >= abs (lh - a[i]))
{
q = lt;
it--;
it--;
if (abs (nh - a[i]) >= abs ((*it).h - a[i]))
p = (*it).id;
else
p = nt;
}
else
{
q = nt;
it++;
it++;
if (abs ((*it).h - a[i]) >= abs (lh - a[i]))
p = lt;
else
p = (*it).id;
}
f[0][i][0] = p;
f[0][i][1] = q;
ga[0][i][0] = abs (a[i] - a[p]);
gb[0][i][1] = abs (a[i] - a[q]);
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < 2; j++)
{
f[1][i][j] = f[0][f[0][i][j]][1 - j];
ga[1][i][j] = ga[0][i][j] + ga[0][f[0][i][j]][1 - j];
gb[1][i][j] = gb[0][i][j] + gb[0][f[0][i][j]][1 - j];
}
}
for (int k = 2; k < 18; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < 2; j++)
{
f[k][i][j] = f[k - 1][f[k - 1][i][j]][j];
ga[k][i][j] = ga[k - 1][i][j] + ga[k - 1][f[k - 1][i][j]][j];
gb[k][i][j] = gb[k - 1][i][j] + gb[k - 1][f[k - 1][i][j]][j];
}
}
}
mn = INT_MAX * 1.0;
for (int i = 1; i <= n; i++)
{
calc (i, x0);
double k = 1.0 * da / db;
if (mn > k)
{
mn = k;
ans = i;
}
else if (mn == k && a[i] > a[ans])
{
ans = i;
}
}
cout << ans << endl;
for (int i = 1; i <= m; i++)
{
calc (k[i], x[i]);
cout << da << ' ' << db << endl;
}
return 0;
}