Pagini recente » Cod sursa (job #1975989) | Cod sursa (job #3262510) | Cod sursa (job #454211) | Borderou de evaluare (job #1569255) | Cod sursa (job #2730382)
#include <fstream>
#include <algorithm>
#include <vector>
#define ll long long
const int N = 1e5 + 5;
struct Queries {
int x, y, ind;
bool operator<(const Queries& a) const{
return y<a.y;
}
};
ll aib[N], mn[N], v[N], ans[N];
std::vector<Queries>q;
void update(int poz, ll val) {
for(;poz<N;poz+=poz&(-poz)) aib[poz]+=val;
}
ll query(int poz) {
ll s = 0;
for(;poz;poz-=poz&(-poz)) s+=aib[poz];
return s;
}
int main() {
std::ifstream fin("distincte.in");
std::ofstream fout("distincte.out");
int n, m, k;
fin>>n>>k>>m;
q.resize(m);
for(int i=1;i<=n;i++) fin>>v[i];
for(int i=0;i<m;i++) fin>>q[i].x>>q[i].y, q[i].ind = i;
std::sort(q.begin(), q.end());
int prev = 1;
for(Queries a:q) {
for(;prev<=a.y;prev++) {
if(!mn[v[prev]]) update(prev, v[prev]);
else {
update(mn[v[prev]], -v[prev]);
update(prev, v[prev]);
}
mn[v[prev]] = prev;
}
ans[a.ind] = query(a.y)-query(a.x-1);
}
for(int i=0;i<m;i++) fout<<ans[i]<<"\n";
}