Cod sursa(job #3138907)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 23 iunie 2023 12:50:48
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <bits/stdc++.h>

using namespace std;

const int MOD = 666013;

int n, m, k;

class SegmentTree
{
    vector <int> t;
    int _n;
    inline int mergeNodes(int a, int b)
    {
        return (a + b >= MOD ? a + b - MOD : a + b);
    }

    void update(int v, int l, int r, int pos, int val)
    {
        if(l == r)
        {
            t[v] += val;
            if(t[v] >= MOD)
                t[v] -= MOD;
            return;
        }
        int m = (l + r) / 2;
        if(pos <= m)
            update(2 * v, l, m, pos, val);
        else
            update(2 * v + 1, m + 1, r, pos, val);
        t[v] = mergeNodes(t[2 * v], t[2 * v + 1]);
    }

    int query(int v, int l, int r, int tl, int tr)
    {
        if(tl > tr)
            return 0;
        if(l == tl  &&  r == tr)
            return t[v];
        int m = (l + r) / 2;
        return mergeNodes(query(2 * v, l, m, tl, min(tr, m)), query(2 * v + 1, m + 1, r, max(m + 1, tl), tr));
    }
public :

    SegmentTree (int n)
    {
        t.resize(4 * n + 1);
        _n = n;
    }

    void update(int pos, int val)
    {
        update(1, 1, _n, pos, val);
    }
    int query(int tl, int tr)
    {
        return query(1, 1, _n, tl, tr);
    }
};

struct query
{
    int left, right, index, ans;
};
vector <query> queries;
vector <int> v, lastPos;

int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    freopen("distincte.in", "r", stdin);
    freopen("distincte.out", "w", stdout);

    cin >> n >> k >> m;
    v.resize(n + 1);
    lastPos.resize(k + 1);
    SegmentTree aint(n);
    queries.resize(m + 1);

    for(int i = 1; i <= n; i ++)
        cin >> v[i];
    for(int i = 1; i <= m; i ++)
    {
        cin >> queries[i].left >> queries[i].right;
        queries[i].index = i;
    }
    sort(queries.begin() + 1, queries.end(), [] (const query &a, const query &b)
         {
             if(a.right == b.right)
                return a.left < b.left;
             return a.right < b.right;
         });

    int j = 1;
    for(int i = 1; i <= n; i ++)
    {
        if(lastPos[v[i]])
            aint.update(lastPos[v[i]], -v[i]);
        aint.update(i, v[i]);
        while(j <= m  &&  queries[j].right <= i)
        {
            queries[j].ans = aint.query(queries[j].left, queries[j].right);
            j ++;
        }
        lastPos[v[i]] = i;
    }

    sort(queries.begin() + 1, queries.end(), [] (const query &a, const query &b)
         {
             return a.index < b.index;
         });

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