#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int __OneWan_2024 = [](){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return 0;
}();
const int N = 100005;
struct Node {
i64 mx, hmx;
} tr[N << 2];
i64 tagmx[N << 2], taghmx[N << 2];
int a[N];
Node merge(Node x, Node y) {
return {
max(x.mx, y.mx),
max(x.hmx, y.hmx)
};
}
void pushup(int p) {
tr[p] = merge(tr[p << 1], tr[p << 1 | 1]);
}
void pushtag(int p, i64 lazymx, i64 lazyhmx) {
tr[p].hmx = max(tr[p].hmx, tr[p].mx + lazyhmx);
taghmx[p] = max(taghmx[p], tagmx[p] + lazyhmx);
tr[p].mx += lazymx;
tagmx[p] += lazymx;
}
void pushdown(int p) {
pushtag(p << 1, tagmx[p], taghmx[p]);
pushtag(p << 1 | 1, tagmx[p], taghmx[p]);
tagmx[p] = taghmx[p] = 0;
}
void modify(int p, int L, int R, int QL, int QR, i64 k) {
if (QL <= L && R <= QR) {
pushtag(p, k, k);
return;
}
pushdown(p);
int mid = L + R >> 1;
if (QL <= mid) modify(p << 1, L, mid, QL, QR, k);
if (QR > mid) modify(p << 1 | 1, mid + 1, R, QL, QR, k);
pushup(p);
}
Node query(int p, int L, int R, int QL, int QR) {
if (QL <= L && R <= QR) {
return tr[p];
}
pushdown(p);
int mid = L + R >> 1;
if (QR <= mid) return query(p << 1, L, mid, QL, QR);
if (QL > mid) return query(p << 1 | 1, mid + 1, R, QL, QR);
return merge(query(p << 1, L, mid, QL, QR), query(p << 1 | 1, mid + 1, R, QL, QR));
}
vector<array<int, 2>> vec[N];
int ans[N];
int last[N];
int main() {
int n;
cin >> n;
vector<int> idx(1, -1000000000);
for (int i = 1 ; i <= n ; i++) {
cin >> a[i];
idx.push_back(a[i]);
}
sort(begin(idx), end(idx));
idx.resize(unique(begin(idx), end(idx)) - begin(idx));
for (int i = 1 ; i <= n ; i++) {
a[i] = lower_bound(begin(idx), end(idx), a[i]) - begin(idx);
}
int m;
cin >> m;
for (int i = 1 ; i <= m ; i++) {
int L, R;
cin >> L >> R;
vec[R].push_back({L, i});
}
for (int i = 1 ; i <= n ; i++) {
modify(1, 1, n, last[a[i]] + 1, i, idx[a[i]]);
for (auto &[L, idx] : vec[i]) {
ans[idx] = query(1, 1, n, L, i).hmx;
}
last[a[i]] = i;
}
for (int i = 1 ; i <= m ; i++) {
cout << ans[i] << "\n";
}
return 0;
}