Cod sursa(job #2366631)

Utilizator alexilasiAlex Ilasi alexilasi Data 4 martie 2019 21:18:05
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <bits/stdc++.h>

#define pii pair <int, int>
#define piii pair <pii, int>
#define mp make_pair
#define f first
#define s second

using namespace std;

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

const int nMax = 100010;

int n, m, k, i, j;
int a[nMax], v[2*nMax], last[nMax], ans[nMax];
piii q[nMax];

void update(int poz, int val)
{
    for (v[poz += n] = val; poz > 1; poz >>= 1) v[poz>>1] = v[poz] + v[poz^1];
}

int query(int l, int r)
{
    int res = 0;
    for (l += n, r += n; l < r; l >>= 1, r >>= 1)
    {
        if (l&1) res += v[l++];
        if (r&1) res += v[--r];
    }
    return res;
}

void read()
{
    fin >> n >> k >> m;
    for(i=1; i<=n; i++)
        fin >> a[i];
    for(i=1; i<=m; i++)
    {
        fin >> q[i].f.s >> q[i].f.f;
        q[i].s = i;
    }
}

void solve()
{
    sort(q+1, q+m+1);
    for(i=1; i<=m; i++)
    {
        for(j=q[i-1].f.f + 1; j<=q[i].f.f; j++)
        {
            if(last[a[j]]) update(last[a[j]], 0);
            update(j, a[j]);
            last[a[j]] = j;
        }
        ans[q[i].s] = query(q[i].f.s, q[i].f.f + 1);
    }
    for(i=1; i<=m; i++)
        fout << ans[i] << '\n';
}

int main()
{
    read();
    solve();
    return 0;
}