Pagini recente » Cod sursa (job #435803) | Cod sursa (job #1566433) | Cod sursa (job #228783) | Cod sursa (job #323005) | Cod sursa (job #2838345)
#include <bits/stdc++.h>
#define MN 107171
using namespace std;
namespace AIB {
int V[MN];
void up(int p, int v) {
if(!p) return;
while(p < MN) V[p] += v, p += p & (-p);
}
int f(int p) {
int r = 0;
while(p) r += V[p], p -= p & (-p);
return r;
}
int query(int st, int dr) {
return f(dr) - (st ? f(st-1) : 0);
}
}
int n, k, m, V[MN], L[MN];
ifstream fi("distincte.in");
ofstream fo("distincte.out");
tuple<int, int, int> Q[MN];
int UnL[MN], R[MN];
int main() {
fi >> n >> k >> m;
for(int i = 1; i <= n; ++i) {
fi >> V[i];
UnL[i] = L[V[i]];
L[V[i]] = i;
}
for(int i = 1, a, b; i <= m; ++i)
fi >> a >> b, Q[i] = {a, b, i};
sort(Q + 1, Q + n + 1, [&](auto a, auto b) {
if(get<1>(a) != get<1>(b)) return get<1>(a) > get<1>(b);
return a > b;
});
for(int i = 1; i <= n; ++i) AIB::up(L[i], i);
for(int i = 1, dr = n; i <= m; ++i) {
while(dr > get<1>(Q[i])) {
AIB::up(UnL[dr], V[UnL[dr]]);
--dr;
}
R[get<2>(Q[i])] = AIB::query(get<0>(Q[i]), get<1>(Q[i]));
}
for(int i = 1; i <= m; ++i)
fo << R[i] << "\n";
return 0;
}