Cod sursa(job #551032)

Utilizator cosmyoPaunel Cosmin cosmyo Data 10 martie 2011 11:33:37
Problema Distincte Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#include <algorithm>
#define f first
#define s second
using namespace std;
const int N = 100005;
int n, m, a[N], l[N], aib[N], v[N], k;
struct tip{int f, s, o;} q[N];

int cmp(tip a, tip b) {
	return a.s < b.s;
}

void update(int x, int val) {
	for(;x <= n; x += (x ^ (x - 1)) & x)
		aib[x] += val;
}

int query(int x) {
	int s = 0;
	for(;x; x -= (x ^ (x - 1)) & x)
		s += aib[x];
	return s;
}

int main() {
	freopen("distincte.in", "r", stdin);
	freopen("distincte.out", "w", stdout);
	int i;
	scanf("%d %d %d", &n, &k, &m);
	for(i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	for(i = 1; i <= m; ++i)
		scanf("%d %d", &q[i].f, &q[i].s), q[i].o = i;

	for(i = 1; i <= n; ++i) {
		l[i] = v[a[i]];
		v[a[i]] = i;
	}

	sort(q + 1, q + m + 1, cmp);
	
	for(i = 1; i <= m; ++i) {
		if(l[i]) {
			update(l[i], - a[i]);
			update(i, a[i]);
		}
		if(i == q[i].s) 
			v[q[i].o] = query(q[i].s) - query(q[i].f - 1);
	}

	for(i = 1; i <= m; ++i)
		printf("%d\n", v[i]);

	return 0;
}