Pagini recente » Cod sursa (job #706082) | Profil MihuMihu | Cod sursa (job #235024) | Monitorul de evaluare | Cod sursa (job #1731706)
#include <algorithm>
#include <fstream>
#define DIM 100005
using namespace std;
ifstream f ("distincte.in");
ofstream g ("distincte.out");
struct bla {
int x , y , p;
}q[DIM] , v[DIM];
int lst[DIM] , sol[DIM] , aib[DIM] , aux[DIM];
int n , m , k , qw;
bool comp (bla a, bla b) {
return a.y > b.y || (a.y == b.y && a.x > b.x);
}
int query(int pos);
void update(int pos , int val);
int main() {
f >> n >> k >> m;
for (int i = 1; i <= k; ++i) {
lst[i] = n + 1;
}
for (int i = 1; i <= n; ++i) {
f >> qw;
aux[i] = qw;
v[i].x = i;
}
for (int i = n; i >= 1; --i) {
v[i].y = lst[aux[v[i].x]];
lst[aux[v[i].x]] = i;
}
sort (v + 1, v + n + 1, comp);
for (int i = 1; i <= m; ++i) {
f >> q[i].x >> q[i].y;
q[i].p = i;
}
sort (q + 1, q + m + 1, comp);
int pos = 1;
for (int i = 1; i <= m; ++i) {
while (v[pos].y > q[i].y) {
update(v[pos].x , aux[v[pos].x]);
++pos;
}
sol[q[i].p] = query(q[i].y) - query(q[i].x - 1);
}
for (int i = 1; i <= m; ++i) {
g << sol[i] << '\n';
}
return 0;
}
void update (int pos , int val) {
while (pos <= n) {
aib[pos] += val;
pos += pos & (pos ^ (pos - 1));
}
}
int query (int pos) {
int sum = 0;
while (pos > 0) {
sum += aib[pos];
pos -= pos & (pos ^ (pos - 1));
}
return sum;
}