主席树(学会了)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define EPS 1e-9
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#include <iomanip>
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];
vector<int>v;
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;
}