Cod sursa(job #2627258)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 10 iunie 2020 11:51:34
Problema Distincte Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

struct queryElement{
    int st, dr, id;
    long long ans;
};

int n, k, m, qCont = 1;
int v[100005], last[100005];
long long aib[100005];
queryElement q[100005];

void scan()
{
    in >> n >> k >> m;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    for(int i = 1; i <= m; i++)
    {
        in >> q[i].st >> q[i].dr;

        q[i].id = i;
    }
}

bool drComp(queryElement a, queryElement b)
{
    if(a.dr == b.dr)
        return(a.st < b.st);

    return(a.dr < b.dr);
}

bool idComp(queryElement a, queryElement b)
{
    return(a.id < b.id);
}

void update(int poz, int val)
{
    for(int i = poz; i <= n; i += i & -i)
        aib[i] += val;
}

long long query(int poz)
{
    long long sum = 0;

    for(int i = poz; i > 0; i -= i & -i)
            sum += aib[i];

    return sum;
}

int main()
{
    scan();

    sort(q + 1, q + m + 1, drComp);

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

        last[v[i]] = i;
        update(i, v[i]);

        if(q[qCont].dr == i)
        {
            q[qCont].ans = query(q[qCont].dr) - query(q[qCont].st - 1);
            qCont++;
        }
    }

    sort(q + 1, q + m + 1, idComp);

    for(int i = 1; i <= m; i++)
        out << q[i].ans << '\n';

    return 0;
}