Cod sursa(job #459209)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 28 mai 2010 15:07:19
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

#define ff first
#define ss second

const int NMAX=100001;
const int MOD=666013;

int N,M,K,x[NMAX],a[262150],ans[NMAX];
vector<int> Poz[NMAX];
pair< pair<int,int> , int > Q[NMAX];

void update(int n,int l,int r,int where,int what)
{
	if (l==r)
	{
		a[n]=what;
		return;
	}
	int m=(l+r)/2;
	if (where <= m) update(2*n,l,m,where,what);
	else update(2*n+1,m+1,r,where,what);
	
	a[n]=a[2*n]+a[2*n+1];
	if (a[n] >= MOD) a[n]-=MOD;
}

int query(int n,int l,int r,int st,int dr)
{
	if (l==st && dr==r) return a[n];
	int m=(l+r)/2;
	if (dr<=m) return query(2*n,l,m,st,dr);
	else
	if (st>m) return query(2*n+1,m+1,r,st,dr);
	else
	{
		int ret=query(2*n,l,m,st,m)+query(2*n+1,m+1,r,m+1,dr);
		if (ret >= MOD) ret-=MOD;
		return ret;
	}
}

int main()
{
	int i,q;
	ifstream fin("distincte.in");
	fin>>N>>K>>M;
	for (i=1;i<=N;++i)
	{
		fin>>x[i];
		Poz[x[i]].push_back(i);
	}
	for (i=1;i<=M;++i)
	{
		fin>>Q[i].ff.ff>>Q[i].ff.ss;
		Q[i].ss=i;
	}
	
	//printf("%lf\n",(double)sizeof(Poz)/1024);
	
	sort(Q+1,Q+M+1);
	
	for (i=1;i<=K;++i)
	{
		reverse(Poz[i].begin(),Poz[i].end());
	    if (!Poz[i].empty())
			update(1,1,N,Poz[i].back(),i);
	}
			
    for (q=1,i=1;q<=M;++q)
    {
		for (;i<Q[q].ff.ff;++i)
		{
			//update(1,1,N,i,0);
			Poz[x[i]].pop_back();
			if (!Poz[x[i]].empty())
			  update(1,1,N,Poz[x[i]].back(),x[i]);
		}
		ans[Q[q].ss]=query(1,1,N,Q[q].ff.ff,Q[q].ff.ss);
	}
	
	ofstream fout("distincte.out");
	for (q=1;q<=M;++q)
		fout<<ans[q]<<"\n";
	
	return 0;
}