#include #include int a[200005]; int b[200005]; int c[200005][2]; int d[200005]; int map[200005]; int cnt[200005]; int min(int a,int b){ return a>b?b:a; } void change(int p,int v,int n,int t){ while(p<=n){ c[p][t] += v; p += (p&-p); } } int ask(int p,int t){ int res = 0; while(p!=0){ res += c[p][t]; p -= (p&-p); } return res; } int getId(int u,int n){ int L = 1, R = n; int res = -1; while(L<=R){ int M = (L+R)/2; if(map[M]<=u){ res = M; L = M+1; } else R = M-1; } return res; } int preWork(int n){ std::sort(d+1,d+1+n); int p = 1, size = 0; while(p<=n){ int np = p; while(np+1<=n && d[np+1]==d[p]) np++; map[++size] = d[p]; cnt[size] = np-p+1; p = np+1; } for(int i = 1; i <= size; i++){ change(i,cnt[i],size,1); } return size; } int getBigger(int u,int n,int t){ int L = u+1, R = n; int res = -1; int base = ask(u,t); while(L<=R){ int M = (L+R)/2; if(ask(M,t)>base){ res = M; R = M-1; } else L = M+1; } return res; } int solve(int n,int size){ int minn = 1e9+7, ans = 1e9+7; for(int i = 2; i <= n-1; i++){ minn = min(minn,a[i-1]); int last = getId(a[i-1],size); change(last,1,size,0); change(last,-1,size,1); int u = getId(a[i],size); if(minn