Cod sursa(job #177124)

Utilizator DorinOltean Dorin Dorin Data 12 aprilie 2008 12:55:54
Problema Distincte Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
# include <stdio.h>

# define input "distincte.in"
# define output "distincte.out"

# define max 100001

int a[max],v[max],at[max],n,i,j,x,y,m,K;
long long arb1[max],arb2[max];
long long rez[max];

inline int bit(int i) { return (i&(i-1))^i; }
int pos[max];

struct point
{
	int x,y;
}po[max];


int divide(int st,int dr)
{
	point p = po[pos[st]];
	x = pos[st];
	while(st < dr)
	{
		while(st < dr && po[pos[dr]].y >= p.y) dr--;
		pos[st] = pos[dr];
		while( st < dr && po[pos[st]].y <= p.y) st++;
		pos[dr] = pos[st];
	}
	pos[st] = x;

	return st;
}

void qsort(int st,int dr)
{
	int	mij = divide(st,dr);
	if(mij -1 > st)	qsort(st, mij-1);
	if( mij + 1 <dr) qsort(mij+1, dr);
}

void elimina(long long * a, int p, int x)
{
	while(p <= n)
	{
		a[p] -= x;
		p+=bit(p);
	}
}

void adauga(long long * a, int p, int x)
{
     while(p <= n)
     {
		 a[p] += x;
         p+=bit(p);
     }
}

long long sum(long long * a, int p)
{
     long long ret = 0;
     while(p)
     {
             ret+=a[p];
             p -= bit(p);
     }
     return ret;
}

int main()
{
    freopen(input, "r", stdin);
    freopen (output, "w", stdout);
    
	scanf("%d%d%d",&n, &m, &K);

	for(i = 1;i <= n+1; i++)
		at[i] =1;

	for(i = 2; i <= n+1; i++)
	{
		scanf("%d",&a[i]);
		v[i] = at[a[i]];
		at[a[i]] = i;
		adauga(arb1, v[i], a[i]);
		adauga(arb2, i-1, a[i]);
	}

	for ( i = 1; i <= K; i++)
	{
		scanf("%d %d",&po[i].x,&po[i].y);
		pos[i] = i;
	}

	qsort(1,K);

	for(i = K, j = n;j && i;--j)
	{
		while(po[pos[i]].y == j)
		{
			int x1,y1;
			x = po[pos[i]].x;
			y = po[pos[i]].y;
			x1 = sum(arb1,x);
			y1 =  sum(arb2,x-1);
			rez[pos[i]] = x1 - y1;
			i--;
		}
		elimina(arb1,v[j+1],a[j+1]);

	}
	for(i = 1;i<= K; i++)
	   printf("%lld\n",rez[i]);

	return 0;
}