Cod sursa(job #2777143)

Utilizator 23liviuStanescu Liviu 23liviu Data 22 septembrie 2021 12:03:17
Problema Distincte Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <algorithm>
using namespace std;

const int MOD = 666013, NMAX = 1e5+5;

template <class TData, class TOver>
class FenwickTree{
public:
    TData* data;
    int len;

    TOver Query(int i)
    {
        TOver sum = 0;
        while(i > 0)
        {
            sum = (sum + data[i]) % MOD;
            i -= (i & (-i));
        }
        return sum;
    }

    void Update(int i, TData delta)
    {
        ++i;
        while(i < len)
        {
            data[i] += delta;
            i += (i & (-i));
        }
    }

    FenwickTree(int capacity)
    {
        len = capacity + 1;
        data = (TData*) calloc(len, sizeof(TData));
    }
};

struct Query
{
	int lft, rght, index;
};

bool cmp(Query a, Query b)
{
	if(a.rght == b.rght)
		return a.lft < b.lft;
	return a.rght < b.rght;
}


FenwickTree<int,int> aib = *(new FenwickTree<int,int>(NMAX));
int* arr = (int*) malloc(NMAX * sizeof(int));
int* ans = (int*) malloc(NMAX * sizeof(int));
int* lastSeenAt = (int*) calloc(NMAX, sizeof(int)); /// KMAX
Query* queries = (Query*) malloc(NMAX * sizeof(Query)); /// MMAX


int main()
{
	ifstream cin ("distincte.in");
	ofstream cout("distincte.out");

    int n, m, k;
    cin >> n >> k >> m;
    for(int i = 0; i < n; i++)
		cin >> arr[i];
    for(int i = 0; i < m; i++)
	{
		cin >> queries[i].lft >> queries[i].rght;
		queries[i].index = i;
	}


	sort(queries, queries + m, cmp);
	int prev = 1;
	for(int i = 0; i < m; i++)
	{
		for(int j = prev; j < queries[i].rght; j++)
		{
			if(lastSeenAt[arr[j]] != 0)
				aib.Update(lastSeenAt[arr[j]], - arr[j]);
			aib.Update(j, arr[j]);
			lastSeenAt[arr[j]] = j;
		}

		int temp = aib.Query(queries[i].rght) - aib.Query(queries[i].lft - 1);
		if(temp < 0)
			temp += MOD;
		ans[queries[i].index] = temp;
		prev = queries[i].rght;
	}


	for(int i = 0; i < m; i++)
		cout << ans[i] << "\n";
    return 0;
}