Pagini recente » Cod sursa (job #740249) | Cod sursa (job #1464259) | Cod sursa (job #2289016) | Cod sursa (job #2320632) | Cod sursa (job #2152507)
#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;
}