Cod sursa(job #2442658)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 24 iulie 2019 18:48:01
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <vector>
#define ub(x) (x&(-x))

using namespace std;

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

constexpr int NMAX=1e5 + 5;

int n, k, m;
int a[NMAX];
int ult[NMAX];
int arb[4*NMAX];

vector <pair <int, int> > v[NMAX];

int sol[NMAX];

void update (int nod, int a, int b, int poz, int val)
{
    if (a==b) {
        arb[nod] += val;
        return;
    }

    int mij=(a+b)/2;

    if (poz <= mij) update(2*nod, a, mij, poz, val);
    else update(2*nod+1, mij+1, b, poz, val);

    arb[nod] = arb[2*nod] + arb[2*nod+1];
}

int query (int nod, int a, int b, int qa, int qb)
{
    if (qa <= a && b <= qb) return arb[nod];

    int mij = (a+b) / 2;
    int r1=0;
    int r2=0;

    if (qa <= mij) r1=query(2*nod, a, mij, qa, qb);
    if (qb > mij)  r2=query(2*nod+1, mij+1, b, qa, qb);

    return r1+r2;
}

int main()
{
    f>>n>>k>>m;

    for (int i=1; i<=n; ++i)
        f>>a[i];

    for (int i=1; i<=m; ++i)
    {
        int x, y;
        f>>x>>y;
        v[y].push_back({x, i});
    }

    for (int i=1; i<=n; ++i)
    {
        if (ult[a[i]] != 0) update(1, 1, n, ult[a[i]], -a[i]);
        update(1, 1, n, i, a[i]);
        ult[a[i]]=i;

        for (int j=0; j<v[i].size(); ++j)
            sol[v[i][j].second] = query(1, 1, n, v[i][j].first, i);
    }

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