Pagini recente » Cod sursa (job #3308985) | Cod sursa (job #1749129) | Cod sursa (job #829641) | Diferente pentru problema/sumtree intre reviziile 33 si 22 | Cod sursa (job #3344784)
#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, pozii;
}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);
}
}
ll solve(int poz){
ll suma= 0;
while(poz >= 1){
suma+= t[poz];
poz-= (poz& -poz);
}
return suma;
}
ll 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].pozii= 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].pozii]= query(inter[i].st, inter[i].dr);
//cout <<"help "<< endl;
}
for(i= 1;i <= m;i++)
cout << rez[i]<< '\n';
return 0;
}