Pagini recente » Cod sursa (job #2875259) | Cod sursa (job #1765640) | Cod sursa (job #3314074) | Cod sursa (job #374668) | Cod sursa (job #3344783)
#include <fstream>
#include <algorithm>
#define int long long
using namespace std;
ifstream cin("distincte.in");
ofstream cout("distincte.out");
using ll= long long;
const int dim= 1e5+ 5;
const int limit= 1e5;
int v[dim], poz[dim];
struct ura{
int st, dr, poz;
}inter[dim];
ll rez[dim], t[dim];
bool cmp(ura a, ura b){
return ((a.dr < b.dr) or (a.dr== b.dr and a.st < b.st));
}
ll suma= 0;
void update(int poz, int val){
while(poz <= limit){
t[poz]+= val;
poz+= (poz& -poz);
}
}
int solve(int poz){
int suma= 0;
while(poz >= 1){
suma+= t[poz];
poz-= (poz& -poz);
}
return suma;
}
int query(int st, int dr){
return solve(dr)- solve(st- 1);
}
signed main()
{
int n, m, k, i, j, l, r;
cin >> n>> k>> m;
for(i= 1;i <= n;i++){
cin >> v[i];
}
for(i= 1;i <= m;i++){
cin >> inter[i].st>> inter[i].dr;
inter[i].poz= i;
}
sort(inter+ 1, inter+ 1+ m, cmp);
for(i= 1;i <= m;i++){
for(j= inter[i- 1].dr+ 1;j <= inter[i].dr;j++){
//cout <<"j= "<< j<< endl;
if(poz[v[j]] > 0)
update(poz[v[j]], -v[j]);
update(j, v[j]);
poz[v[j]]= j;
}
rez[inter[i].poz]= query(inter[i].st, inter[i].dr);
//cout <<"help "<< endl;
}
for(i= 1;i <= m;i++)
cout << rez[i]<< '\n';
return 0;
}