// #define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <cmath>
#include <climits>
#include <vector>
#include <queue>
#include <deque>
#include <array>
#include <list>
#include <stack>
#include <tuple>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <string>
#include <cstring>
#include <random>
#include <bitset>
#include <iomanip>
#include <iterator>
#include <functional>
#include <ctime>
#include <chrono>
#include <cctype>
#include <fstream>
#include <ranges>
#include <numeric>
#include <complex>
#include <cassert>
using namespace std;
// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define int long long
#define sz(x) ((int)(x).size())
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define pb push_back
#define pf push_front
#define ff first
#define ss second
#define unique(x) (x).erase(unique(all(x)), (x).end())
#define min3(a, b, c) min(a, min(b, c))
#define max3(a, b, c) max(a, max(b, c))
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define ROF(i, a, b) for (int i = (a); i >= (b); i--)
using vi = vector<int>;
using vd = vector<double>;
using vpii = vector<pair<int, int>>;
using vpdd = vector<pair<double, double>>;
using pii = pair<int, int>;
using pdd = pair<double, double>;
template <typename Container>
void PRINT(const Container& container) {
for (const auto& e : container) {
cout << e << ' ';
} cout << '\n';
}
void print_double(double ans, int num) {
cout << fixed << setprecision(num) << ans << '\n';
}
const int inf = 1e18;
const double eps = 1e-9;
const double PI = 3.141592653589793;
string alh = "abcdefghijklmnopqrstuvwxyz";
string ALH = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
struct PersistentImplicitSegmentTree {
struct Node {
int sum;
Node* left;
Node* right;
Node() : sum(0), left(nullptr), right(nullptr) {}
Node(Node* left, Node* right, int sum) : left(left), right(right), sum(sum) {}
};
PersistentImplicitSegmentTree(int size) : n(size) {
roots.push_back(nullptr);
}
void change(int pos, int val) {
Current_root = updatePoint(Current_root, 0, n - 1, pos, val);
}
int query_v(int version, int l, int r) {
return queryRange(roots[version], 0, n - 1, l, r);
}
Node* Current_root = nullptr;
vector<Node*> roots;
int n;
Node* updatePoint(Node* node, int l, int r, int pos, int val) {
if (!node) {
node = new Node();
}
if (l == r) {
return new Node(nullptr, nullptr, val);
}
int mid = l + (r - l) / 2;
Node* newNode = new Node(*node);
if (pos <= mid) {
newNode->left = updatePoint(node->left, l, mid, pos, val);
}
else {
newNode->right = updatePoint(node->right, mid + 1, r, pos, val);
}
newNode->sum = (newNode->left ? newNode->left->sum : 0) + (newNode->right ? newNode->right->sum : 0);
return newNode;
}
int queryRange(Node* node, int l, int r, int const_l, int const_r) {
if (!node) {
return 0;
}
if (const_l > r || const_r < l) {
return 0;
}
if (const_l <= l && r <= const_r) {
return node->sum;
}
int mid = l + (r - l) / 2;
int leftSum = queryRange(node->left, l, mid, const_l, const_r);
int rightSum = queryRange(node->right, mid + 1, r, const_l, const_r);
return leftSum + rightSum;
}
};
void Solve() {
int n; cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
map<int, int> last;
for (int i = 0; i < n; i++) {
last[a[i]] = -1;
}
map<int, int> last_last;
for (int i = 0; i < n; i++) {
last_last[a[i]] = -1;
}
PersistentImplicitSegmentTree ST(inf);
for (int i = 0; i < n; i++) {
if (last[a[i]] == -1 && last_last[a[i]] == -1) {
ST.change(i, 1);
last[a[i]] = i;
}
else if (last[a[i]] != -1 && last_last[a[i]] == -1) {
ST.change(i, 1);
ST.change(last[a[i]], -1);
last_last[a[i]] = last[a[i]];
last[a[i]] = i;
}
else {
ST.change(i, 1);
ST.change(last[a[i]], -1);
ST.change(last_last[a[i]], 0);
last_last[a[i]] = last[a[i]];
last[a[i]] = i;
}
ST.roots.push_back(ST.Current_root);
}
int q; cin >> q;
for (int i = 0; i < q; i++) {
int l, r; cin >> l >> r;
--l;
--r;
cout << ST.query_v(r + 1, l, r) << endl;
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
/*
________________
/ Just solved it \
| in my mind |
\________________/
/
/
/> フ ___________
| _ _| | |
/`ミ _x 彡 | WA 2 |
/ | |__________|
/ ヽ ノ / /
/ ̄| | | | /_________ /
| ( ̄ヽ__ヽ_)_)
\二つ
*/
/*
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
*/
// auto start = chrono::high_resolution_clock::now();
int multitest = false;
if (multitest == true) {
int ctt; cin >> ctt;
for (int i = 0; i < ctt; i++) {
Solve();
}
}
else {
Solve();
}
// auto end = chrono::high_resolution_clock::now();
/*
cout << "Time taken: "
<< chrono::duration_cast<chrono::milliseconds>(end - start).count()
<< " milliseconds" << endl;
*/
return 0;
}
Ly8gI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAKCiNpbmNsdWRlIDxpb3N0cmVhbT4gCiNpbmNsdWRlIDxhbGdvcml0aG0+IAojaW5jbHVkZSA8Y21hdGg+IAojaW5jbHVkZSA8Y2xpbWl0cz4gCiNpbmNsdWRlIDx2ZWN0b3I+IAojaW5jbHVkZSA8cXVldWU+IAojaW5jbHVkZSA8ZGVxdWU+IAojaW5jbHVkZSA8YXJyYXk+IAojaW5jbHVkZSA8bGlzdD4gCiNpbmNsdWRlIDxzdGFjaz4gCiNpbmNsdWRlIDx0dXBsZT4gCiNpbmNsdWRlIDxzZXQ+IAojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4gCiNpbmNsdWRlIDxtYXA+IAojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4gCiNpbmNsdWRlIDxzdHJpbmc+IAojaW5jbHVkZSA8Y3N0cmluZz4gCiNpbmNsdWRlIDxyYW5kb20+IAojaW5jbHVkZSA8Yml0c2V0PiAKI2luY2x1ZGUgPGlvbWFuaXA+IAojaW5jbHVkZSA8aXRlcmF0b3I+IAojaW5jbHVkZSA8ZnVuY3Rpb25hbD4gCiNpbmNsdWRlIDxjdGltZT4gCiNpbmNsdWRlIDxjaHJvbm8+IAojaW5jbHVkZSA8Y2N0eXBlPiAKI2luY2x1ZGUgPGZzdHJlYW0+IAojaW5jbHVkZSA8cmFuZ2VzPiAKI2luY2x1ZGUgPG51bWVyaWM+IAojaW5jbHVkZSA8Y29tcGxleD4gCiNpbmNsdWRlIDxjYXNzZXJ0PiAKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QiKSAKLy8gI3ByYWdtYSBHQ0MgdGFyZ2V0KCJhdngyLGJtaSxibWkyLGx6Y250LHBvcGNudCIpCgojZGVmaW5lIGludCAgICAgICAgICAgICAgIGxvbmcgbG9uZyAKI2RlZmluZSBzeih4KSAgICAgICAgICAgICAoKGludCkoeCkuc2l6ZSgpKSAKI2RlZmluZSBtcCAgICAgICAgICAgICAgICBtYWtlX3BhaXIgCiNkZWZpbmUgYWxsKHgpICAgICAgICAgICAgKHgpLmJlZ2luKCksICh4KS5lbmQoKSAKI2RlZmluZSBwYiAgICAgICAgICAgICAgICBwdXNoX2JhY2sgCiNkZWZpbmUgcGYgICAgICAgICAgICAgICAgcHVzaF9mcm9udCAKI2RlZmluZSBmZiAgICAgICAgICAgICAgICBmaXJzdCAKI2RlZmluZSBzcyAgICAgICAgICAgICAgICBzZWNvbmQgCiNkZWZpbmUgdW5pcXVlKHgpICAgICAgICAgKHgpLmVyYXNlKHVuaXF1ZShhbGwoeCkpLCAoeCkuZW5kKCkpIAojZGVmaW5lIG1pbjMoYSwgYiwgYykgICAgIG1pbihhLCBtaW4oYiwgYykpIAojZGVmaW5lIG1heDMoYSwgYiwgYykgICAgIG1heChhLCBtYXgoYiwgYykpIAojZGVmaW5lIEZPUihpLCBhLCBiKSAgICAgIGZvciAoaW50IGkgPSAoYSk7IGkgPD0gKGIpOyBpKyspIAojZGVmaW5lIFJPRihpLCBhLCBiKSAgICAgIGZvciAoaW50IGkgPSAoYSk7IGkgPj0gKGIpOyBpLS0pIAoKdXNpbmcgdmkgPSB2ZWN0b3I8aW50PjsKdXNpbmcgdmQgPSB2ZWN0b3I8ZG91YmxlPjsKdXNpbmcgdnBpaSA9IHZlY3RvcjxwYWlyPGludCwgaW50Pj47CnVzaW5nIHZwZGQgPSB2ZWN0b3I8cGFpcjxkb3VibGUsIGRvdWJsZT4+Owp1c2luZyBwaWkgPSBwYWlyPGludCwgaW50PjsKdXNpbmcgcGRkID0gcGFpcjxkb3VibGUsIGRvdWJsZT47Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgp2b2lkIFBSSU5UKGNvbnN0IENvbnRhaW5lciYgY29udGFpbmVyKSB7CiAgICBmb3IgKGNvbnN0IGF1dG8mIGUgOiBjb250YWluZXIpIHsKICAgICAgICBjb3V0IDw8IGUgPDwgJyAnOwogICAgfSBjb3V0IDw8ICdcbic7Cn0KCnZvaWQgcHJpbnRfZG91YmxlKGRvdWJsZSBhbnMsIGludCBudW0pIHsKICAgIGNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKG51bSkgPDwgYW5zIDw8ICdcbic7Cn0KCmNvbnN0IGludCBpbmYgPSAxZTE4Owpjb25zdCBkb3VibGUgZXBzID0gMWUtOTsKY29uc3QgZG91YmxlIFBJID0gMy4xNDE1OTI2NTM1ODk3OTM7CgpzdHJpbmcgYWxoID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKc3RyaW5nIEFMSCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CgpzdHJ1Y3QgUGVyc2lzdGVudEltcGxpY2l0U2VnbWVudFRyZWUgewogICAgc3RydWN0IE5vZGUgewogICAgICAgIGludCBzdW07CiAgICAgICAgTm9kZSogbGVmdDsKICAgICAgICBOb2RlKiByaWdodDsKCiAgICAgICAgTm9kZSgpIDogc3VtKDApLCBsZWZ0KG51bGxwdHIpLCByaWdodChudWxscHRyKSB7fQogICAgICAgIE5vZGUoTm9kZSogbGVmdCwgTm9kZSogcmlnaHQsIGludCBzdW0pIDogbGVmdChsZWZ0KSwgcmlnaHQocmlnaHQpLCBzdW0oc3VtKSB7fQogICAgfTsKCiAgICBQZXJzaXN0ZW50SW1wbGljaXRTZWdtZW50VHJlZShpbnQgc2l6ZSkgOiBuKHNpemUpIHsKICAgICAgICByb290cy5wdXNoX2JhY2sobnVsbHB0cik7CiAgICB9CgogICAgdm9pZCBjaGFuZ2UoaW50IHBvcywgaW50IHZhbCkgewogICAgICAgIEN1cnJlbnRfcm9vdCA9IHVwZGF0ZVBvaW50KEN1cnJlbnRfcm9vdCwgMCwgbiAtIDEsIHBvcywgdmFsKTsKICAgIH0KCiAgICBpbnQgcXVlcnlfdihpbnQgdmVyc2lvbiwgaW50IGwsIGludCByKSB7CiAgICAgICAgcmV0dXJuIHF1ZXJ5UmFuZ2Uocm9vdHNbdmVyc2lvbl0sIDAsIG4gLSAxLCBsLCByKTsKICAgIH0KCiAgICBOb2RlKiBDdXJyZW50X3Jvb3QgPSBudWxscHRyOwogICAgdmVjdG9yPE5vZGUqPiByb290czsKICAgIGludCBuOwoKICAgIE5vZGUqIHVwZGF0ZVBvaW50KE5vZGUqIG5vZGUsIGludCBsLCBpbnQgciwgaW50IHBvcywgaW50IHZhbCkgewogICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgICBub2RlID0gbmV3IE5vZGUoKTsKICAgICAgICB9CgogICAgICAgIGlmIChsID09IHIpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlKG51bGxwdHIsIG51bGxwdHIsIHZhbCk7CiAgICAgICAgfQoKICAgICAgICBpbnQgbWlkID0gbCArIChyIC0gbCkgLyAyOwogICAgICAgIE5vZGUqIG5ld05vZGUgPSBuZXcgTm9kZSgqbm9kZSk7CgogICAgICAgIGlmIChwb3MgPD0gbWlkKSB7CiAgICAgICAgICAgIG5ld05vZGUtPmxlZnQgPSB1cGRhdGVQb2ludChub2RlLT5sZWZ0LCBsLCBtaWQsIHBvcywgdmFsKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5ld05vZGUtPnJpZ2h0ID0gdXBkYXRlUG9pbnQobm9kZS0+cmlnaHQsIG1pZCArIDEsIHIsIHBvcywgdmFsKTsKICAgICAgICB9CgogICAgICAgIG5ld05vZGUtPnN1bSA9IChuZXdOb2RlLT5sZWZ0ID8gbmV3Tm9kZS0+bGVmdC0+c3VtIDogMCkgKyAobmV3Tm9kZS0+cmlnaHQgPyBuZXdOb2RlLT5yaWdodC0+c3VtIDogMCk7CgogICAgICAgIHJldHVybiBuZXdOb2RlOwogICAgfQoKICAgIGludCBxdWVyeVJhbmdlKE5vZGUqIG5vZGUsIGludCBsLCBpbnQgciwgaW50IGNvbnN0X2wsIGludCBjb25zdF9yKSB7CiAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnN0X2wgPiByIHx8IGNvbnN0X3IgPCBsKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnN0X2wgPD0gbCAmJiByIDw9IGNvbnN0X3IpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGUtPnN1bTsKICAgICAgICB9CgogICAgICAgIGludCBtaWQgPSBsICsgKHIgLSBsKSAvIDI7CgogICAgICAgIGludCBsZWZ0U3VtID0gcXVlcnlSYW5nZShub2RlLT5sZWZ0LCBsLCBtaWQsIGNvbnN0X2wsIGNvbnN0X3IpOwogICAgICAgIGludCByaWdodFN1bSA9IHF1ZXJ5UmFuZ2Uobm9kZS0+cmlnaHQsIG1pZCArIDEsIHIsIGNvbnN0X2wsIGNvbnN0X3IpOwoKICAgICAgICByZXR1cm4gbGVmdFN1bSArIHJpZ2h0U3VtOwogICAgfQp9OwoKdm9pZCBTb2x2ZSgpIHsKICAgIGludCBuOyBjaW4gPj4gbjsKICAgIHZlY3RvcjxpbnQ+IGEobik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGNpbiA+PiBhW2ldOwogICAgfQoKICAgIG1hcDxpbnQsIGludD4gbGFzdDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgbGFzdFthW2ldXSA9IC0xOwogICAgfQoKICAgIG1hcDxpbnQsIGludD4gbGFzdF9sYXN0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBsYXN0X2xhc3RbYVtpXV0gPSAtMTsKICAgIH0KCiAgICBQZXJzaXN0ZW50SW1wbGljaXRTZWdtZW50VHJlZSBTVChpbmYpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAobGFzdFthW2ldXSA9PSAtMSAmJiBsYXN0X2xhc3RbYVtpXV0gPT0gLTEpIHsKICAgICAgICAgICAgU1QuY2hhbmdlKGksIDEpOwoKICAgICAgICAgICAgbGFzdFthW2ldXSA9IGk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGxhc3RbYVtpXV0gIT0gLTEgJiYgbGFzdF9sYXN0W2FbaV1dID09IC0xKSB7CiAgICAgICAgICAgIFNULmNoYW5nZShpLCAxKTsKICAgICAgICAgICAgU1QuY2hhbmdlKGxhc3RbYVtpXV0sIC0xKTsKCiAgICAgICAgICAgIGxhc3RfbGFzdFthW2ldXSA9IGxhc3RbYVtpXV07CiAgICAgICAgICAgIGxhc3RbYVtpXV0gPSBpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgU1QuY2hhbmdlKGksIDEpOwogICAgICAgICAgICBTVC5jaGFuZ2UobGFzdFthW2ldXSwgLTEpOwogICAgICAgICAgICBTVC5jaGFuZ2UobGFzdF9sYXN0W2FbaV1dLCAwKTsKCiAgICAgICAgICAgIGxhc3RfbGFzdFthW2ldXSA9IGxhc3RbYVtpXV07CiAgICAgICAgICAgIGxhc3RbYVtpXV0gPSBpOwogICAgICAgIH0KCiAgICAgICAgU1Qucm9vdHMucHVzaF9iYWNrKFNULkN1cnJlbnRfcm9vdCk7CiAgICB9CgogICAgaW50IHE7IGNpbiA+PiBxOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxOyBpKyspIHsKICAgICAgICBpbnQgbCwgcjsgY2luID4+IGwgPj4gcjsKCiAgICAgICAgLS1sOwogICAgICAgIC0tcjsKCiAgICAgICAgY291dCA8PCBTVC5xdWVyeV92KHIgKyAxLCBsLCByKSA8PCBlbmRsOwogICAgfQp9CgpzaWduZWQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQudGllKDApOwoKICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fX19fX19fCiAgICAgICAgICAgICAgICAgICAgIC8gSnVzdCBzb2x2ZWQgaXQgXAogICAgICAgICAgICAgICAgICAgICB8ICAgaW4gbXkgbWluZCAgIHwKICAgICAgICAgICAgICAgICAgICAgXF9fX19fX19fX19fX19fX18vCiAgICAgICAgICAgICAgICAgICAgLwogICAgICAgICAgICAgICAgICAgLwrjgIDjgIDjgIDjgIDjgIDvvI/vvJ7jgIAg44OVICAgICAgICAgX19fX19fX19fX18K44CA44CA44CA44CA44CAfCDjgIBf44CAIF98ICAgICAgIHwgICAgICAgICAgfArjgIAg44CA44CA44CA77yPYOODnyBfeCDlvaEgICAgICAgfCAgIFdBIDIgICB8CuOAgOOAgCDjgIAgL+OAgOOAgOOAgCDjgIAgfCAgICAgICB8X19fX19fX19fX3wK44CA44CA44CAIC/jgIAg44O944CA44CAIO++iSAgICAgICAgLyAgICAgICAgICAvCuOAgO+8j++/o3zjgIDjgIAgfOOAgHzjgIB8ICAgICAgIC9fX19fX19fX18gLwrjgIB8ICjvv6Pjg73vvL9f44O9XylfKQrjgIDvvLzkuozjgaQKCiAgICAqLwoKICAgIC8qCiAgICBmcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKICAgIGZyZW9wZW4oIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CiAgICAqLwoKICAgIC8vIGF1dG8gc3RhcnQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgogICAgaW50IG11bHRpdGVzdCA9IGZhbHNlOwogICAgaWYgKG11bHRpdGVzdCA9PSB0cnVlKSB7CiAgICAgICAgaW50IGN0dDsgY2luID4+IGN0dDsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdHQ7IGkrKykgewogICAgICAgICAgICBTb2x2ZSgpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIFNvbHZlKCk7CiAgICB9CgogICAgLy8gYXV0byBlbmQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CgogICAgLyoKICAgIGNvdXQgPDwgIlRpbWUgdGFrZW46ICIKICAgICAgICAgPDwgY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6bWlsbGlzZWNvbmRzPihlbmQgLSBzdGFydCkuY291bnQoKQogICAgICAgICA8PCAiIG1pbGxpc2Vjb25kcyIgPDwgZW5kbDsKICAgICovCgogICAgcmV0dXJuIDA7Cn0=