Pagini recente » Cod sursa (job #305538) | Cod sursa (job #460233) | Cod sursa (job #341211) | Cod sursa (job #1099408) | Cod sursa (job #1991734)
#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;
}