Pagini recente » Cod sursa (job #3342441) | Cod sursa (job #498057) | Diferente pentru problema/intervale2 intre reviziile 14 si 15 | Cod sursa (job #342896) | Cod sursa (job #3344771)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("distincte.in");
ofstream cout("distincte.out");
using ll= long long;
const int dim= 1e5+ 5;
int v[dim], poz[dim];
struct ura{
int st, dr, poz;
}inter[dim];
ll rez[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 adauga(int l, int r){
for(int i= l;i <= r;i++){
if(poz[v[i]]== 0)poz[v[i]]= i, suma+= v[i];
else{
if(poz[v[i]] < i)poz[v[i]]= i;
}
}
}
void sterge(int l, int r){
for(int i= l;i <= r;i++){
if(poz[v[i]]== i){
suma-= v[i];
poz[v[i]]= 0;
}
}
}
int main()
{
int n, k, m, 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);
l= r= 0;
for(i= 1;i <= m;i++){
if(r < inter[i].st){
sterge(l, r);
adauga(inter[i].st, inter[i].dr);
}
else
if(l < inter[i].st){
sterge(l, inter[i].st- 1);
adauga(r+ 1, inter[i].dr);
}
else{
adauga(inter[i].st, l- 1);
adauga(r+ 1, inter[i].dr);
}
rez[inter[i].poz]= suma;
}
for(i= 1;i <= m;i++)
cout << rez[i]<< '\n';
return 0;
}