Cod sursa(job #3301891)

Utilizator Cezar2009Cezar Mihai Titihazan Cezar2009 Data 30 iunie 2025 22:51:33
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
//https://infoarena.ro/problema/distincte
//#pragma GCC optimize ("Ofast")
//#pragma GCC optimize ("fast-math")
//#pragma GCC optimize ("unroll-loops")
//#define _USE_MATH_DEFINES
#include <iostream>
#include <fstream>
#include <vector>
//#include <cstring>
//#include <cmath>
//#include <bitset>
//#include <queue>
//#include <utility>
#include <algorithm>
//#include <string>
//#include <map>
//#include <climits>
//#include <iomanip>
using namespace std;
#define inti int
#define int int64_t

ifstream fin("distincte.in");
ofstream fout("distincte.out");

struct element
{
	int first, second, index;
};

int v[100005], aib[100005], la[100005], rez[100005];
void update(int p, int val, int n)
{
	int i;
	for (i = p; i <= n; i += i & (-i))
	{
		aib[i] += val;
	}
}
int suma(int p)
{
	int i, rez = 0;
	for (i = p; i >= 1; i -= i & (-i))
	{
		rez += aib[i];
	}
	return rez;
}
bool comparare(element a, element b)
{
	if (a.second == b.second)
		return a.first < b.first;
	return a.second < b.second;
}
signed main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, k, m, i, x, y,j;
	vector <element> q;

	fin >> n >> k >> m;

	q.resize(m + 1);

	for (i = 1; i <= n; ++i)
	{
		fin >> v[i];
	}

	for (i = 1; i <= m; ++i)
	{
		fin >> x >> y;
		q[i].first=x;
		q[i].second=y;
		q[i].index=i;
	}

	sort(q.begin(), q.end(), comparare);

	/*for (i = 1; i <= m; ++i)
	{
		cout << q[i].first << " " << q[i].second << "\n";
	}*/
	
	j = 1;
	for (i = 1; i <= n; ++i)
	{
		if (la[v[i]])
		{
			update(la[v[i]], -v[i], n);
		}

		update(i, v[i], n);
		la[v[i]] = i;

		/*for (int k = 1; k <= n; ++k)
			cout << aib[k] << " ";
		cout << "\n";*/

		while ((j <= m) && (i == q[j].second))
		{
			rez[q[j].index] = (suma(q[j].second) - suma(q[j].first - 1))%666013;
			++j;
		}

		
		if (j > m)
			break;
	}

	for(i=1;i<=m;++i)
	{
		fout << rez[i] << "\n";
	}



	return 0;
}