#include <iostream> #include <algorithm> #include <cstdio> #include <set> #include <iterator> using namespace std; const int N = 100007; struct City { int n, h; friend bool operator < (const City& a, const City& b) {return a.h < b.h;} } c[N]; set<City> s; set<City>::iterator I; int h[N], f1[N], f2[N]; struct Data { int d; long long a, b, x; Data() {d = a = b = x = 0;} } f[N][18]; template <typename T> inline T Abs(T x) {return x < 0 ? -x : x;} inline int Dist(int a, int b) {return Abs(h[a] - h[b]);} inline int Dist(set<City>::iterator A, set<City>::iterator B) {return Abs(A -> h - B -> h);} inline int Dist(int a, set<City>::iterator I) {return Abs(h[a] - I -> h);} void Special_Work() { int i; scanf("%*d%*d"); cout << 1 << endl; cin >> i; while (i--) printf("0 0\n"); } inline void Update(int i, int j) { if (f1[i] == -1 || Dist(i, j) < Dist(i, f1[i]) || (Dist(i, j) == Dist(i, f1[i]) && h[j] < h[f1[i]])) {f2[i] = f1[i]; f1[i] = j;} else if (f2[i] == -1 || Dist(i, j) < Dist(i, f2[i]) || (Dist(i, j) == Dist(i, f2[i]) && h[j] < h[f2[i]])) f2[i] = j; } inline void Update(int i, set<City>::iterator I) { if (f1[i] == -1 || Dist(i, I) < Dist(i, f1[i]) || (Dist(i, I) == Dist(i, f1[i]) && I -> h < h[f1[i]])) {f2[i] = f1[i]; f1[i] = I -> n;} else if (f2[i] == -1 || Dist(i, I) < Dist(i, f2[i]) || (Dist(i, I) == Dist(i, f2[i]) && I -> h < h[f2[i]])) f2[i] = I -> n; } int main() { int n, m, x0, i, j, k, x, s0 = 0; long long a, b, A = 0, B = 0; cin >> n; if (n == 1) {Special_Work(); return 0;} for (i = 1; i <= n; ++i) {scanf("%d", &h[i]); c[i].h = h[i]; c[i].n = i;} s.insert(c[n]); f1[n - 1] = n; s.insert(c[n - 1]); if (n <= 4) for (i = n - 2; i > 0; --i) { f1[i] = f2[i] = -1; for (j = i + 1; j <= n; ++j) Update(i, j); } else { s.insert(c[n - 2]); s.insert(c[n - 3]); for (i = n - 2; i > n - 4; --i) { f1[i] = f2[i] = -1; for (j = i + 1; j <= n; ++j) Update(i, j); } for (i = n - 4; i > 0; --i) { f1[i] = f2[i] = -1; s.insert(c[i]); I = s.find(c[i]); if ((++I) != s.end()) { Update(i, I); if ((++I) != s.end()) {Update(i, I); --I;} --I; } if (I != s.begin()) { Update(i, --I); if (I != s.begin()) Update(i, --I); } } } for (i = n - 2; i > 0; --i) { f[i][0].d = f1[f2[i]]; f[i][0].x = Dist(f1[f2[i]], f2[i]) + Dist(f2[i], i); f[i][0].b = Dist(f1[f2[i]], f2[i]); f[i][0].a = Dist(f2[i], i); } for (j = 1; (1 << j) < n; ++j) for (i = 1; i + (1 << j) <= n; ++i) { if (!(f[i][j].d = f[f[i][j - 1].d][j - 1].d)) continue; f[i][j].a = f[f[i][j - 1].d][j - 1].a + f[i][j - 1].a; f[i][j].b = f[f[i][j - 1].d][j - 1].b + f[i][j - 1].b; f[i][j].x = f[f[i][j - 1].d][j - 1].x + f[i][j - 1].x; } cin >> x0; for (i = n; i > 0; --i) { x = a = b = 0; k = i; for (j = 17; j >= 0; --j) if (f[k][j].d && x + f[k][j].x <= x0) {a += f[k][j].a; b += f[k][j].b; x += f[k][j].x; k = f[k][j].d;} if (f2[k] && x + Dist(k, f2[k]) <= x0) {a += Dist(k, f2[k]); x += Dist(k, f2[k]);} if (!s0 || (b && !B) || a * B < b * A || (a * B == b * A && h[i] > h[s0])) {A = a; B = b; s0 = i;} } cout << s0 << endl; cin >> m; while (m--) { scanf("%d%d", &k, &x0); x = a = b = 0; for (j = 17; j >= 0; --j) if (f[k][j].d && x + f[k][j].x <= x0) {a += f[k][j].a; b += f[k][j].b; x += f[k][j].x; k = f[k][j].d;} if (f2[k] && x + Dist(k, f2[k]) <= x0) {a += Dist(k, f2[k]); x += Dist(k, f2[k]);} printf("%lld %lld\n", a, b); } return 0; } /************************************************************** Problem: 2316 User: admin Language: C++ Result: Accepted Time:2713 ms Memory:65040 kb ****************************************************************/