Cod sursa(job #38211)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 25 martie 2007 16:05:36
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define nmax 100111
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define f first
#define s second
#define MOD 666013

int n,m,k,A[nmax],s[nmax],last[nmax],sol[nmax],perm[nmax];
pair <int,int> P[nmax];

bool cmp(const int i,const int j)
{
	return P[i].f<P[j].f||(P[i].f==P[j].f&&i<j);
}

void Add(int i,int y)
{
	if(!i)
		return ;
	for(;i<=n;i=(i|(i-1))+1)
	{
		s[i]+=y;
		while(s[i]>=MOD)
			s[i]-=MOD;
		while(s[i]<0)
			s[i]+=MOD;
	}
}

int query(int i)
{
	int aux=0;
	for(;i;i&=i-1)
	{
		aux+=s[i];
		if(aux>=MOD)
			aux-=MOD;
	}
	return aux;
}

int main()
{
	int i,j,a,b;
	freopen("distincte.in","r",stdin);
	freopen("distincte.out","w",stdout);

	scanf("%d %d %d",&n,&k,&m);
	FOR(i,1,n+1)
		scanf("%d",&A[i]);
	FOR(j,0,m)
		scanf("%d %d",&P[j].s,&P[j].f),	perm[j]=j;
	sort(perm,perm+m,cmp);
	j=0;
	FOR(i,1,n+1)
	{
		Add(i,A[i]);
		Add(last[A[i]],-A[i]);
		last[A[i]]=i;
		for(;j<m&&P[perm[j]].f==i;++j)
		{
			sol[perm[j]]=query(i)-query(P[perm[j]].s-1);
			if(sol[perm[j]]<0)
				sol[perm[j]]+=MOD;				
		}
	}
	FOR(i,0,m)
		printf("%d\n",sol[i]);
	return 0;
}