主席树(学会了)
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define EPS 1e-9 #define PI acos(-1.0) #define inf 0x3f3f3f3f #define ll long long #define ull unsigned long long #include const int MOD = 1E9+7; const int maxn = 1e5+5; const int base = 131; const int dx[] = {0,0,-1,1,-1,-1,1,1}; const int dy[] = {-1,1,0,0,-1,1,-1,1}; using namespace std; struct node { int l,r,sum; } hjt[maxn*40]; int cnt,root[maxn]; int a[maxn]; vectorv; int getid(int x) { return lower_bound(v.begin(),v.end(),x)-v.begin()+1; } void insert1(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)insert1(l,m,hjt[pre].l,hjt[now].l,p); else insert1(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 tmp=hjt[hjt[R].l].sum-hjt[hjt[L].l].sum; if(k<=tmp)return query(l,m,hjt[L].l,hjt[R].l,k); else return query(m+1,r,hjt[L].r,hjt[R].r,k-tmp); } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { v.clear(); cnt=0; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); v.push_back(a[i]); } sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); for(int i=1; i<=n; i++) { insert1(1,n,root[i-1],root[i],getid(a[i])); } while(m--) { int l,r,k; scanf("%d%d",&l,&r); bool flag=false; int len=r-l+1; for(int j=1; j<=len-2; j++) { ll a=v[query(1,n,root[l-1],root[r],len-j+1)-1]; ll b=v[query(1,n,root[l-1],root[r],len-(j+1)+1)-1]; ll c=v[query(1,n,root[l-1],root[r],len-(j+2)+1)-1]; if(b+c>a) { flag=true; printf("%lld\n",a+c+b); break; } } if(!flag)printf("-1\n"); } } return 0; }