Cod sursa(job #1729682)

Utilizator luci2000lup lucia luci2000 Data 15 iulie 2016 14:24:21
Problema Distincte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <algorithm>
using namespace std;
typedef struct segm {int st,dr,nro; long long suma;} SEGM;
ifstream cin("distincte.in");
ofstream cout("distincte.out");
int N,K,M,i,j;
int V[100001];
int PRED[100001];
int U[100001];
SEGM S[100001];
int F[100001];
int righ;

void update(int poz, int v)
{
	while (poz<=N)
	{
		F[poz]+=v;
		poz=poz+(poz&(-poz));
	}
}

int f(int poz)
{
	int rez=0;
	while (poz>=1)
	{
		rez=rez+F[poz];
		poz=poz-(poz&(-poz));
	}
	return rez;
}

int query(int st, int dr)
{
	return f(dr)-f(st-1);
}

void actualizare(int poz, int v)
{
	if (PRED[poz]==0)
		update(poz,v);
	else
	{
		update(PRED[poz],-v);
		update(poz,v);
	}
}

int cmp(SEGM s1, SEGM s2)
{
	if (s1.dr<s2.dr)
		return 1;
	return 0;
}

int cmpnro(SEGM s1, SEGM s2)
{
	if (s1.nro<s2.nro)
		return 1;
	return 0;
}

int main()
{
	cin>>N>>K>>M;
	for (i=1;i<=N;i++)
		cin>>V[i];
	// se determina sirul PRED
	for (i=1;i<=N;i++)
		if (U[V[i]]==0)
		{
			U[V[i]]=i;
			PRED[i]=0;
		}
		else
		{
			PRED[i]=U[V[i]];
			U[V[i]]=i;
		}
	for (i=1;i<=M;i++)
	{
		cin>>S[i].st>>S[i].dr;
		S[i].nro=i;
		S[i].suma=0;
	}
	sort(S+1,S+M+1,cmp);
	righ=0;
	for (i=1;i<=M;i++)
	{
		for (j=max(righ+1,S[i].st);j<=S[i].dr;j++)
			actualizare(j,V[j]);
		S[i].suma=query(S[i].st,S[i].dr);
		righ=S[i].dr;
	}
	// se reordoneaza intervalele dupa nro
	sort(S+1,S+M+1,cmpnro);
	for (i=1;i<=M;i++)
		cout<<S[i].suma<<"\n";
	cin.close();
	cout.close();
	return 0;
}