Cod sursa(job #2831757)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 12 ianuarie 2022 01:58:30
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <bits/stdc++.h>

#define int long long

using namespace std;

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

const int NMAX = 100000;

int N, K, M;
int v[NMAX + 5];
int ans[NMAX + 5];
int frecv[NMAX + 5];
struct elem
{
    int idx, l, r, sqrt_idx;
    bool operator < (const elem &other) const
    {
        if(sqrt_idx != other.sqrt_idx)
        {
            return make_pair(l, r) < make_pair(other.l, other.r);
        }
        if(sqrt_idx & 1)
        {
            return r < other.r;
        }
        else
        {
            return r > other.r;
        }
    }
};
elem ask[NMAX + 5];

signed main()
{
    fin >> N >> K >> M;
    for(int i = 1; i <= N; i ++)
    {
        fin >> v[i];
    }
    const int block = sqrt(N);
    for(int i = 1; i <= M; i ++)
    {
        fin >> ask[i].l >> ask[i].r;
        ask[i].idx = i;
        ask[i].sqrt_idx = ask[i].l / block;
    }
    sort(ask + 1, ask + M + 1);
    int suma = 0;
    for(int i = ask[1].l; i <= ask[1].r; i ++)
    {
        if(frecv[v[i]] == 0)
        {
            suma += v[i];
        }
        frecv[v[i]] ++;
    }
    ans[ask[1].idx] = suma;
    int st = ask[1].l, dr = ask[1].r;
    for(int i = 2; i <= M; i ++)
    {
        while(st > ask[i].l)
        {
            st--;
            if(frecv[v[st]] == 0)
            {
                suma += v[st];
            }
            frecv[v[st]]++;
        }
        while(st < ask[i].l)
        {
            if(frecv[v[st]] == 1)
            {
                suma -= v[st];
            }
            frecv[v[st]] --;
            st ++;
        }
        while(dr < ask[i].r)
        {
            dr++;
            if(frecv[v[dr]] == 0)
            {
                suma += v[dr];
            }
            frecv[v[dr]] ++;
        }
        while(dr > ask[i].r)
        {
            if(frecv[v[dr]] == 1)
            {
                suma -= v[dr];
            }
            frecv[v[dr]]--;
            dr--;
        }
        ans[ask[i].idx] = suma;
    }
    for(int i = 1; i <= M; i ++)
    {
        fout << ans[i] << '\n';
    }
    fout << '\n';
    return 0;
}