Cod sursa(job #2527195)

Utilizator mihneacazCazacu Mihnea mihneacaz Data 19 ianuarie 2020 19:35:09
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const int NMAX = 100005;
const int MOD = 666013;

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

struct data
{
    int left;
    int right;
    int index;
};

int v[NMAX], last[NMAX], previous[NMAX], dist[NMAX];

bool cmp(data a, data b)
{
    if(a.right == b.right)
        return a.left < b.left;
    else
        return a.right < b.right;
}

long long tree[4 * NMAX];

void update(int node, int st, int dr, int poz, int val)
{
    if(st == dr) {
        tree[node] = val;
        return;
    }
    int med = (st + dr) / 2;
    if(poz <= med)
        update(node * 2, st, med, poz, val);
    else
        update(node * 2 + 1, med + 1, dr, poz, val);
    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

long long query(int node, int st, int dr, int a, int b)
{
    long long sum = 0;
    if(a <= st && dr <= b) {
        return tree[node];
    }
    int med = (st + dr) / 2;
    if(a <= med)
        sum += query(node * 2, st, med, a, b);
    if(b > med)
        sum += query(node * 2 + 1, med + 1, dr, a, b);
    return sum;
}

int main() {
    int n, k, m;
    cin >> n >> k >> m;
    for(int i = 1; i <= n; ++i) {
        cin >> v[i];
        dist[i] = v[i];
        if(last[v[i]] != 0)
            previous[i] = last[v[i]];
        last[v[i]] = i;
    }
    vector <data> q;
    for(int i = 1; i <= m; ++i) {
        int x, y;
        cin >> x >> y;
        data elem;
        elem.left = x;
        elem.right = y;
        elem.index = i - 1;
        q.emplace_back(elem);
    }
    sort(q.begin(), q.end(), cmp);
    for(int i = q[0].right; i >= 1;  --i) {
        if(previous[i] != 0) {
            int curr = i, newcurr = 0;
            while(previous[curr] > 0) {
                newcurr = previous[curr];
                previous[curr] = 0;
                dist[newcurr] = 0;
                curr = newcurr;
            }
            dist[newcurr] = 0;
        }
        update(1, 1, n, i, dist[i]);
    }
    int lastdr = q[0].right;
    vector <long long> solution;
    solution.resize(m);
    for(auto a: q) {
        for(int i = lastdr + 1; i <= a.right; ++i) {
            if(previous[i] != 0) {
                update(1, 1, n, previous[i], 0);
            }
            update(1,1, n, i, dist[i]);
        }
        lastdr = a.right;
        solution[a.index] = query(1, 1, n, a.left, a.right) % MOD;
    }
    for(int a: solution)
        cout << a << "\n";
    return 0;
}