Cod sursa(job #2271853)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 29 octombrie 2018 12:29:03
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

struct tst{
    int r, i;
};

ll n, m, test, aib[100005], v[100005], b[100005], last[100005], ans[100005];
vector<int> r[100005];
vector<tst> q[100005];

void update(ll idx, ll val)
{
    while(idx <= n){
        aib[idx] += val;
        idx += (idx & (-idx));
    }
}

ll read(ll idx)
{
    ll sum = 0;
    while(idx){
        sum += aib[idx];
        idx -= (idx & (-idx));
    }
    return sum;
}

int main()
{
    ifstream fin ("distincte.in");
    ofstream fout ("distincte.out");
    fin >> n >> m >> test;
    for (ll i = 1; i <= n; ++i){
        fin >> v[i];
        b[i] = last[v[i]];
        r[b[i]].push_back(i);
        last[v[i]] = i;
    }
    for (int t = 1; t <= test; ++t){
        ll l, r;
        fin >> l >> r;
        q[l].push_back({r, t});
    }
    for (int t = 1; t <= n; ++t){
        for (auto x : r[t-1])
            update(x, v[x]);
        for (auto Q : q[t])
            ans[Q.i] = read(Q.r)-read(t-1);
    }
    for (int i = 1; i <= test; ++i)
        fout << ans[i] << "\n";
    return 0;
}