Cod sursa(job #1731706)

Utilizator cristina_borzaCristina Borza cristina_borza Data 19 iulie 2016 16:50:37
Problema Distincte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <algorithm>
#include <fstream>

#define DIM 100005

using namespace std;

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

struct bla {
    int x , y , p;
}q[DIM] , v[DIM];

int lst[DIM] , sol[DIM] , aib[DIM] , aux[DIM];
int n , m , k , qw;

bool comp (bla a, bla b) {
    return a.y > b.y || (a.y == b.y && a.x > b.x);
}

int query(int pos);
void update(int pos , int val);

int main() {
    f >> n >> k >> m;
    for (int i = 1; i <= k; ++i) {
        lst[i] = n + 1;
    }
    for (int i = 1; i <= n; ++i) {
        f >> qw;
        aux[i] = qw;
        v[i].x = i;
    }

    for (int i = n; i >= 1; --i) {
        v[i].y = lst[aux[v[i].x]];
        lst[aux[v[i].x]] = i;
    }

    sort (v + 1, v + n + 1, comp);
    for (int i = 1; i <= m; ++i) {
        f >> q[i].x >> q[i].y;
        q[i].p = i;
    }

    sort (q + 1, q + m + 1, comp);
    int pos = 1;

    for (int i = 1; i <= m; ++i) {
        while (v[pos].y > q[i].y) {
            update(v[pos].x , aux[v[pos].x]);
            ++pos;
        }

        sol[q[i].p] = query(q[i].y) - query(q[i].x - 1);
    }

    for (int i = 1; i <= m; ++i) {
        g << sol[i] << '\n';
    }
    return 0;
}

void update (int pos , int val) {
    while (pos <= n) {
        aib[pos] += val;
        pos += pos & (pos ^ (pos - 1));
    }
}

int query (int pos) {
    int sum = 0;
    while (pos > 0) {
        sum += aib[pos];
        pos -= pos & (pos ^ (pos - 1));
    }

    return sum;
}