Cod sursa(job #3289673)

Utilizator mihai_bosIancu Mihai mihai_bos Data 27 martie 2025 23:05:22
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

struct el{
    int st, dr, ind;
};
bool comp(el a, el b) {
    return a.dr < b.dr;
}
const int NMAX = 100005;
const int MMAX = 100005;

long long n, m, k, i, lastpos[NMAX], v[NMAX], sol[NMAX], aint[4*NMAX];
el queries[MMAX];

void build(int nod, int st, int dr){
    if(st == dr)
        aint[nod] = v[st];
    else {
        int mij = (st + dr) / 2;
        build(2*nod, st, mij);
        build(2*nod+1, mij+1,dr);
        aint[nod] = aint[2*nod] + aint[2*nod+1];
    }
}
void update(int nod, int st, int dr, int pos, int val) {
    if(st == dr)
        aint[nod] = val;
    else {
        int mij = (st + dr) / 2;
        if(pos <= mij)
            update(2*nod,st,mij,pos,val);
        else
            update(2*nod+1,mij+1,dr,pos,val);
        aint[nod] = aint[2*nod] + aint[2*nod+1];
    }
}
int query(int nod, int st, int dr, int x, int y) {
    if(x <= st && y >= dr) {
        return aint[nod];
    }
    else {
        int mij = (st + dr) / 2;
        if(y <= mij)
            return query(2*nod,st, mij,x,y);
        else if(x>=mij+1)
            return query(2*nod+1, mij+1, dr, x, y);
        else
            return query(2*nod,st, mij,x,y) + query(2*nod+1, mij+1, dr, x, y);
    }


}

int main()
{
    in >> n >> k >> m;
    for(i = 1; i <= n; ++i)
        in >> v[i];
    build(1, 1, n);
    for(i = 1; i <= m; ++i) {
        in >> queries[i].st >> queries[i].dr;
        queries[i].ind = i;
    }
    sort(queries + 1, queries + m + 1, comp);
    int p = 1;
    for(i = 1; i <= m; ++i) {
        while(p <= queries[i].dr) {
            update(1,1,n,p,v[p]);
            if(lastpos[v[p]])
                update(1,1,n,lastpos[v[p]],0);
            lastpos[v[p]] = p;
            p++;
        }
        sol[queries[i].ind] = query(1,1,n,queries[i].st,queries[i].dr);
    }
    for(i = 1; i <= m; ++i)
        out << sol[i] << '\n';
    return 0;
}