http://acm.hdu.edu.cn/showproblem.php?pid=6601

#include <bits/stdc++.h> #define int long long using namespace std; const int maxn=1e5+5; int n,m,a[maxn]; vector<int> v; inline int getid(int x){ return lower_bound(v.begin(),v.end(),x)-v.begin()+1; } typedef struct Node{ int l,r,sum; } no; no hjt[maxn*40]; int cnt,root[maxn]; void insert(int l,int r,int pre,int &now,int p){ hjt[++cnt]=hjt[pre]; now=cnt; hjt[now].sum++; if(l==r) return; int m=(l+r)>>1; if(p<=m) insert(l,m,hjt[pre].l,hjt[now].l,p); else insert(m+1,r,hjt[pre].r,hjt[now].r,p); } int query(int l,int r,int L,int R,int k){ if(l==r) return l; int m=(l+r)>>1; int t=hjt[hjt[R].l].sum-hjt[hjt[L].l].sum; if(k<=t) return query(l,m,hjt[L].l,hjt[R].l,k); else return query(m+1,r,hjt[L].r,hjt[R].r,k-t); } signed main(){ //freopen("in","r",stdin); while(~scanf("%lld%lld",&n,&m)){ v.clear();cnt=0; for(int i=1; i<=n; i++){ scanf("%lld",&a[i]); v.push_back(a[i]); } sort(v.begin(),v.end()); v.erase(std::unique(v.begin(),v.end()),v.end()); for(int i=1; i<=n; i++) insert(1,n,root[i-1],root[i],getid(a[i])); while(m--){ int l,r; scanf("%lld%lld",&l,&r); int len=r-l+1;//区间内数的个数 int flag=0; for(int i=1;i<=r-l-1;i++){ int first=query(1,n,root[l-1],root[r],len-i+1)-1;//最大的边 int second=query(1,n,root[l-1],root[r],len-i)-1;//第二大 int third=query(1,n,root[l-1],root[r],len-i-1)-1;//第三大 int e1=v[first],e2=v[second],e3=v[third]; if(e2+e3>e1){ printf("%lld ",e1+e2+e3); flag=1; break; } } if(flag==0) printf("-1 "); } } return 0; }