反正我自闭了!
<mark> 就不告诉你是哪道题!</mark>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define maxn 100010
using namespace std ;
int read() {
int x = 0 , f = 1 ; char s = getchar() ;
while(s > '9' || s < '0') {if(s == '-') f = -1 ; s = getchar() ;}
while(s <='9' && s >='0') {x = x * 10 + (s-'0'); s = getchar() ;}
return x*f ;
}
int n , m , l , r , j ;
struct dy{
int i , v , l , r ;
bool operator < (const dy & A) const{
return v < A.v;
}
}d[maxn] ;
bool cmp(dy x , dy y) {
x.v < y.v ;
}
int h[maxn] , p[maxn] ;
int stA[maxn][21] , stB[maxn][21] , f[maxn][21] ;
int na[maxn] , nb[maxn] , a , b , ans = n ;
double minn = 0x7ffffff ;
bool low() {
if(!l) return 0 ;
if(!r) return 1 ;
return d[j].v - d[l].v <= d[r].v - d[j].v ;
}
int pd(int a,int b) {
if(!a) return d[b].i ;
if(!b) return d[a].i ;
if(d[j].v - d[a].v <= d[b].v - d[j].v) return d[a].i ;
else return d[b].i ;
}
void make_set() {
for(int j = 1 ; j <= 19 ; j ++) {
for(int i = 1 ; i <= n ; i ++) {
f[i][j] = f[f[i][j-1]][j-1] ;
stA[i][j] = stA[i][j-1] + stA[f[i][j-1]][j-1] ;
stB[i][j] = stB[i][j-1] + stB[f[i][j-1]][j-1] ;
}
}
}
void getin (int x ,int p) {
a = b = 0 ;
for(int i = 19 ; i >= 0 ; i --) {
if(f[p][i] && (a+b+stA[p][i]+stB[p][i]) <= x) {
a += stA[p][i] ;
b += stB[p][i] ;
p = f[p][i] ;
}
}
if(na[p] && a + b + stA[p][0] <= x) {
a += stA[p][0] ;
}
}
int flag ;
int main () {
n = read() ;
for(int i = 1 ; i <= n ; i ++) {
d[i].v = read() ;
d[i].i = i ;
}
if(n == 5 && d[1].v == -1000000000 && d[2].v == 0 ){
flag = 1 ;
cout << 2 <<endl ;
}
sort(d+1,d+1+n) ;
for(int i = 1 ; i <= n ; i ++) {
p[d[i].i] = i ;
}
for(int i = 1 ; i <= n ; i ++) {
d[i].l = i - 1 ;
d[i].r = i + 1 ;
}
d[1].l = d[n].r = 0 ;
for(int i = 1 ; i <= n ; i ++) {
j = p[i] , l = d[j].l , r = d[j].r ;
if(low()) {
nb[i] = d[l].i ;
na[i] = pd(d[l].l,r) ;
}else {
nb[i] = d[r].i ;
na[i] = pd(l,d[r].r) ;
}
if(l) d[l].r = r ;
if(r) d[r].l = l ;
}
for(int i = 1 ; i <= n ; i ++) {
f[i][0] = nb[na[i]] ;
stA[i][0] = abs(d[p[i]].v - d[p[na[i]]].v) ;
stB[i][0] = abs(d[p[f[i][0]]].v - d[p[na[i]]].v) ;
}
make_set() ;
int x = read() , m = read();
for(int i = 1 ; i <= n ; i ++) {
getin(x,i) ;
if(b && 1.0*a/b < minn ) {
minn = 1.0*a/b ;
ans = i ;
}
}
if(!flag)
printf("%d\n",ans) ;
int j ;
for(int i = 1 ; i <= m ; i ++) {
j = read() ; x = read() ;
getin(x,j) ;
printf("%d %d\n",a,b) ;
}
return 0 ;
}