Cod sursa(job #3364213)

Utilizator Belea_DariusBelea Mihai Darius Belea_Darius Data 31 august 2026 15:04:03
Problema Distincte Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>
#define MAXN 100000
#define MAXQ 100000

using namespace std;

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

struct elem{
    int st, dr, pos;
} query[MAXQ];

int aib[MAXN + 1], v[MAXN + 1], last[MAXN + 1], rez[MAXQ + 1];

int cmp(elem A, elem B){
    return A.dr < B.dr;
}

int lsb(int x){
    return x & -x;
}
void update(int n, int pos, int val){
    while(pos <= n){
        aib[pos] += val;
        pos += lsb(pos);
    }
}
int f_query(int pos){
    int rez = 0;
    while(pos > 0){
        rez += aib[pos];
        pos -= lsb(pos);
    }
    return rez;
}

int main()
{
    int n, q, k, i, cur;

    fin >> n >> k >> q;
    for(i = 1; i <= n; i++){
        fin >> v[i];
    }
    for(i = 1; i <= q; i++){
        fin >> query[i].st >> query[i].dr;
        query[i].pos = i;
    }
    sort(query + 1, query + q + 1, cmp);

    cur = 1;
    for(i = 1; i <= n; i++){
        update(i, last[v[i]] + 1, v[i]);
        last[v[i]] = i;
//        printf("i = %d, cur = %d, q.dr = %d\n", i, cur, query[cur].dr);
        while(cur <= q && query[cur].dr == i){
//            printf("cur = %d, i = %d\n", cur, i);
            rez[query[cur].pos] = f_query(query[cur].st);
            cur++;
        }
    }
    for(i = 1; i <= q; i++){
        fout << rez[i] << "\n";
    }
    return 0;
}