Cod sursa(job #3243847)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 21 septembrie 2024 19:28:21
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>

const std :: string FILENAME = "distincte";

std :: ifstream in (FILENAME + ".in");

std :: ofstream out (FILENAME + ".out");

const int NMAX = 1e5 + 5;

int n;

int m;

int k;

int ult;

int cnt;

int x;

int y;

int v[NMAX];

int last[NMAX];

int arb[4 * NMAX];

int ans[NMAX];

std :: pair <std :: pair <int, int>, int> q[NMAX];

void update(int nod, int st, int dr, int val)
{
    if(st == dr)
    {
        arb[nod] += val * v[st];
    }
    else
    {
        int mij = (st + dr) / 2;

        if(x <= mij)
        {
            update(nod * 2, st, mij, val);
        }
        else
        {
            update(nod * 2 + 1, mij + 1, dr, val);
        }

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

int query(int nod, int st, int dr)
{
    if(x <= st && y >= dr)
    {
        return arb[nod];
    }

    int mij = (st + dr) / 2;

    if(y <= mij)
    {
        return query(nod * 2, st, mij);
    }
    if(x > mij)
    {
        return query(nod * 2 + 1, mij + 1, dr);
    }

    return query(nod * 2, st, mij) + query(nod * 2 + 1, mij + 1, dr);
}

int main()
{

    in >> n >> k >> m;

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

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

        q[i].second = i;
    }

    std :: sort(q + 1, q + m + 1);

    cnt = 1;

    for(int i = 1; i <= n; i ++)
    {
        x = last[v[i]];

        if(x)
        {
            update(1, 1, n, - 1);
        }

        last[v[i]] = i;

        x = last[v[i]];

        update(1, 1, n, 1);

        while(q[cnt].first.first == i)
        {
            x = q[cnt].first.second;

            y = q[cnt].first.first;

            cnt ++;

            ans[q[cnt - 1].second] = query(1, 1, n);
        }
    }

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

    return 0;
}