Cod sursa(job #2152507)

Utilizator AndreidgDragomir Andrei Valentin Andreidg Data 5 martie 2018 16:51:58
Problema Distincte Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>

using namespace std;

const int SZ = 100000;
const int MOD = 666013;

bool is_dup[SZ + 1];
int where_first[SZ + 1];
int where_last[SZ + 1];
int first[SZ + 1];
int last[SZ + 1];
long long sum_first[SZ + 1];
long long sum_last[SZ + 1];
int dup_first[SZ];
int dup_last[SZ];
int left_seq[SZ + 1];
int right_seq[SZ + 1];

int main(int argc, char** argv) {
	int M, N, K;
	int qi, qj;
	int i, j, u, ndup = 0;
	long long uu;
	ifstream f("distincte.in");
	f >> N >> K >> M;
	for (i = 1; i <= N; i++) {
		left_seq[i] = ndup;
		f >> u;
		last[i] = u;
		if (where_last[u] == 0) {
			where_first[u] = i;
			first[i] = u;
		}
		else {
			if (!is_dup[u]) {
				is_dup[u] = true;
				dup_first[ndup] = u;
				ndup++;
			}
			last[where_last[u]] = 0;
		}
		where_last[u] = i;
		right_seq[i] = ndup - 1;
	}
	j = 0;
	for (i = 1; i <= N; i++) {
		u = last[N - i + 1];
		if (u != 0 && is_dup[u]) {
			dup_last[j] = u;
			j++;
		}
		sum_first[i] = sum_first[i - 1] + first[i];
		sum_last[i] = sum_last[i - 1] + last[i];
	}
	ofstream g("distincte.out");
	for (i = 0; i < M; i++) {
		f >> qi >> qj;
		if (j <= N - i + 1) {
			uu = sum_first[qj] - sum_last[qi - 1];
			u = dup_first[0];
			for (j = 0; j < ndup && where_first[u] < qi; j++) {
				u = dup_first[j];
				if (where_last[u] > qj) {
					uu -= u;
				}
			}
			if (j > 0) {
				for (j = left_seq[qi]; j <= right_seq[qj]; j++) {
					u = dup_first[j];
					if (where_last[u] > qj) {
						uu += u;
					}
				}
			}
		}
		else {
			uu = sum_last[N] - sum_last[qi - 1];
			uu -= sum_first[N] - sum_first[qj];
			u = dup_last[0];
			for (j = 0; j < ndup && where_last[u] > qj; j++) {
				u = dup_last[j];
				if (where_first[u] < qi) {
					uu -= u;
				}
			}
			if (j > 0) {
				for (j = left_seq[qi]; j <= right_seq[qj]; j++) {
					u = dup_first[j];
					if (where_first[u] < qi) {
						uu += u;
					}
				}
			}
		}
		g << uu % MOD << '\n';
	}
	f.close();
	g.close();
	return 0;
}