Cod sursa(job #3223971)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 14 aprilie 2024 11:25:09
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<bits/stdc++.h>

using namespace std;

struct coord
{
    int x, y, pos;
};

const int NMAX = 1e5 + 5, MOD = 666013;
int n, m, k, v[NMAX], arbint[4 * NMAX], frev[NMAX], ans[NMAX];
coord q[NMAX];

bool fcmp(coord a, coord b)
{
    return a.y < b.y;
}

void update(int idx, int st, int dr, int val, int poz)
{
    if(st == dr)
    {
        arbint[idx] = val; 
        return;
    }

    int mij = (st + dr) / 2;
    if(poz <= mij)
        update(idx * 2, st, mij, val, poz);
    else
        update(idx * 2 + 1, mij + 1, dr, val, poz);
    arbint[idx] = (arbint[idx * 2] + arbint[idx * 2 + 1]) % MOD;
}

int query(int idx, int st, int dr, int arbst, int arbdr)
{
    if(st > arbdr || dr < arbst)
        return 0;

    if(st >= arbst && dr <= arbdr)
        return arbint[idx];
    
    int mij = (st + dr) / 2;
    return (query(idx * 2, st, mij, arbst, arbdr) + query(idx * 2 + 1, mij + 1, dr, arbst, arbdr)) % MOD;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    freopen("distincte.in", "r", stdin);
    freopen("distincte.out", "w", stdout);

    cin >> n >> m >> k;
    int x;
    for(int i = 1; i <= n; i++)
        cin >> v[i];
    
    int a, b;
    for(int i = 1; i <= k; i++)
    {
        cin >> a >> b;
        q[i] = {a, b, i};
    }

    sort(q + 1, q + k + 1, fcmp);

    int st = 1;
    for(int i = 1 ; i <= k; i++)
    {
        while(st <= q[i].y)
        {
            if(frev[v[st]])
                update(1, 1, n, 0, frev[v[st]]);
            update(1, 1, n, v[st], st);
            frev[v[st]] = st;
            st++;
        }
        
        ans[q[i].pos] = query(1, 1, n, q[i].x, q[i].y);
    }
    
    for(int i = 1; i <= k; i++)
        cout << ans[i] << "\n";
}