Cod sursa(job #3308604)

Utilizator razvanmrt_06Mariuta Razvan razvanmrt_06 Data 26 august 2025 16:06:18
Problema Distincte Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int Nmax = 100005;

int n, m, k, v[Nmax], sol[Nmax], lastPos[Nmax];
long long aint[4*Nmax];

struct qry{
    int st, dr, idx;
    bool operator < (const qry &a){
        return dr < a.dr;
    }
} q[Nmax];

void Update(int nod, int st, int dr, int poz, int val){
    if(st == dr){
        aint[nod] = val;
        return;
    }
    int mij = (st + dr) / 2;
    if(poz <= mij){
        Update(2*nod, st, mij, poz, val);
    }
    else{
        Update(2*nod+1, mij+1, dr, poz, val);
    }
    aint[nod] = aint[2*nod] + aint[2*nod+1];
}

int Query(int nod, int st, int dr, int a, int b){
    if(st == a && dr == b){
        return aint[nod];
    }
    int mij = (st + dr) / 2;
    if(b <= mij){
        return Query(2*nod, st, mij, a, b);
    }
    else{
        if(a > mij){
            return Query(2*nod+1, mij+1, dr, a, b);
        }
        else{
            return Query(2*nod, st, mij, a, mij) + Query(2*nod+1, mij+1, dr, mij+1, b);
        }
    }
}

int main(){
    ifstream fin("distincte.in");
    ofstream fout("distincte.out");
    fin >> n >> k >> m;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }
    for(int i = 1; i <= m; i++){
        int st, dr;
        fin >> st >> dr;
        q[i] = {st, dr, i};
    }
    sort(q+1, q+m+1);

    int p = 1;
    for(int i = 1; i <= m; i++){
        while(p <= q[i].dr){
            Update(1, 1, n, p, v[p]);
            if(lastPos[v[p]] != 0){
                Update(1, 1, n, lastPos[v[p]], 0);
            }
            lastPos[v[p]] = p;
            p++;
        }
        sol[q[i].idx] = Query(1, 1, n, q[i].st, q[i].dr);
    }

    for(int i = 1; i <= m; i++){
        fout << sol[i] % 666013 << "\n";
    }

    return 0;
}