Cod sursa(job #1991734)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 18 iunie 2017 11:30:51
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

class AIB
{
public:
    AIB(int sz)
    {
        v = new int[sz + 1];
        n = sz;
        for(int i = 1; i <= n; ++i)
            v[i] = 0;
    }
    AIB(int vec[], int sz)
    {
        v = new int[sz + 1];
        n = sz;
        for(int i = 1; i <= n; ++i)
            v[i] = 0;
        for(int i = 1; i <= n; ++i)
            Add(i, vec[i]);
    }
    ~AIB()
    {
        delete[] v;
    }
    void Add(int ind, int val)
    {
        while(ind <= n)
        {
            v[ind] += val;
            ind += ind & (-ind);
        }
    }
    int Query(int dr)
    {
        int ret = 0;
        while(dr >= 1)
        {
            ret += v[dr];
            dr -= dr & (-dr);
        }
        return ret;
    }
    int Query(int st, int dr)
    {
        return Query(dr) - Query(st - 1);
    }
private:
    int * v;
    int n;
};

struct Query
{
    int st, dr, ans;
};

const int nMax = 100005;
const int mMax = 100005;
const int kMax = 100005;

int n, k, m;
int v[nMax];
Query query[mMax];
vector<Query*> qDr[nMax]; //query-urile care au capatul dreapta pe i
int last[kMax];

void citire()
{
    ifstream in("distincte.in");
    in >> n >> k >> m;
    for(int i = 1; i <= n; ++i)
        in >> v[i];
    for(int i = 1; i <= m; ++i)
    {
        in >> query[i].st >> query[i].dr;
        qDr[query[i].dr].push_back(&query[i]);
    }
    in.close();
}

void rezolvare()
{
    AIB aib(n);
    for(int i = 1; i <= n; ++i)
    {
        if(last[v[i]] != 0)
            aib.Add(last[v[i]], -v[i]);
        aib.Add(i, v[i]);
        for(auto q:qDr[i])
            q->ans = aib.Query(q->st, q->dr);
        last[v[i]] = i;
    }
}

void afisare()
{
    ofstream out("distincte.out");
    for(int i = 1; i <= m; ++i)
        out << query[i].ans << "\n";
    out.close();
}

int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}