Pagini recente » Cod sursa (job #2008914) | Cod sursa (job #204791) | Cod sursa (job #2019580) | Cod sursa (job #244976) | Cod sursa (job #389634)
Cod sursa(job #389634)
#include <iostream>
#include <fstream>
using namespace std;
int N, K, M, sum;
int Val, Pos, start, finish;
int elem[100001], lst[100001];
int S[100001], SumArb[4*100001+66];
struct OffQuery {
int st;
int dr;
int pos;
} off[100001];
int cmp(OffQuery a, OffQuery b) {
if(a.dr!=b.dr) { return a.dr<b.dr; }
return a.st<b.st;
}
void Update(int nod, int left, int right) {
if(left==right) {
SumArb[nod]=Val;
return;
}
int mij=(left+right)/2;
if(Pos<=mij) { Update(2*nod, left, mij); }
else { Update(2*nod+1, mij+1, right); }
SumArb[nod]=SumArb[2*nod]+SumArb[2*nod+1];
}
void Query(int nod, int left, int right) {
if(start<=left && right<=finish) {
sum+=SumArb[nod];
return;
}
int mij=(left+right)/2;
if(start<=mij) { Query(2*nod, left, mij); }
if(mij<finish) { Query(2*nod+1, mij+1, right); }
}
int main() {
fstream f1, f2;
int i, j, p, q, nr=1;
f1.open("distincte.in", ios::in);
f1>>N>>K>>M;
for(i=1; i<=N; i++) {
f1>>elem[i];
Val=elem[i]; Pos=i;
Update(1, 1, N);
}
for(i=1; i<=M; i++) {
f1>>off[i].st>>off[i].dr;
off[i].pos=i;
}
f1.close();
sort(off+1, off+M+1, cmp);
for(i=1; i<=N; i++) {
if(i==off[nr].dr) {
//aflu suma pe intervalul off[nr].st -> off[nr].dr
if(lst[elem[i]]!=i && lst[elem[i]]) {
p=lst[elem[i]]; elem[p]=0;
Val=0; Pos=p;
Update(1, 1, N);
}
lst[elem[i]]=i;
sum=0;
start=off[nr].st; finish=off[nr].dr;
Query(1, 1, N);
S[off[nr].pos]=sum;
nr++; i--;
}
else {
if(lst[elem[i]]!=i && lst[elem[i]]) {
p=lst[elem[i]]; elem[p]=0;
Val=0; Pos=p;
Update(1, 1, N);
}
lst[elem[i]]=i;
}
}
f2.open("distincte.out", ios::out);
for(i=1; i<=M; i++) {
f2<<S[i]<<endl;
}
f2.close();
return 0;
}