Pagini recente » Cod sursa (job #2941579) | Cod sursa (job #1581249) | Cod sursa (job #2257580) | Cod sursa (job #1312694) | Cod sursa (job #37990)
Cod sursa(job #37990)
#include <stdio.h>
#define fin "distincte.in"
#define fout "distincte.out"
#define Nmax 100001
#define Mod 666013
int N,M,K,v[Nmax],used[Nmax];
int ask[Nmax][4];
inline void swap(int &a,int &b) { int aux; aux=a; a=b; b=aux; }
void qsort(int st,int dr,int p) {
int i,j,m;
i=st; j=dr;
m=ask[(i+j)/2][p];
do {
while (ask[i][p]<m) ++i;
while (ask[j][p]>m) --j;
if (i<=j) {
swap(ask[i][0],ask[j][0]);
swap(ask[i][1],ask[j][1]);
swap(ask[i][2],ask[j][2]);
swap(ask[i][3],ask[j][3]);
++i; --j;
}
} while (i<j);
if (i<dr) qsort(i,dr,p);
if (j>st) qsort(st,j,p);
}
int maxf(int a,int b) {
if (a>b) return a;
else return b;
}
int main() {
int i,j,k;
long long sum=0;
freopen(fin,"r",stdin); freopen(fout,"w",stdout);
scanf("%i%i%i",&N,&K,&M);
for (i=1;i<=N;++i) {
scanf("%i",&v[i]);
if (!used[v[i]]) sum+=v[i];
used[v[i]]++;
}
for (i=1;i<=M;++i) {
scanf("%i%i",&ask[i][0],&ask[i][1]);
ask[i][2]=i;
}
qsort(1,M,0);
for (i=1;i<=M;) {
j=i;
while (ask[j][0]==ask[i][0] && j<=M) ++j;
qsort(i,j-1,1);
i=j;
}
ask[0][0]=1;
ask[0][1]=N;
for (i=1;i<=M;) {
if (ask[i-1][1]>ask[i][1]) {
for (j=ask[i-1][1];j>ask[i][1];--j) {
if (used[v[j]]==1)
sum-=v[j];
--used[v[j]];
}
for (j=ask[i-1][0];j<ask[i][0];++j) {
if (used[v[j]]==1)
sum-=v[j];
--used[v[j]];
}
}
else {
for (j=ask[i-1][1]+1;j<=ask[i][1];++j) {
if (used[v[j]]==0)
sum+=v[j];
++used[v[j]];
}
for (j=ask[i-1][0];j<ask[i][0];++j) {
if (used[v[j]]==1)
sum-=v[j];
--used[v[j]];
}
}
ask[i][3]=sum;
for (j=i+1;ask[j][0]==ask[i][0] && j<=M;++j) {
for (k=ask[j-1][1]+1;k<=ask[j][1];++k) {
if (used[v[k]]==0)
sum+=v[k];
++used[v[k]];
}
ask[j][3]=sum;
}
i=j;
}
qsort(1,M,2);
for (i=1;i<=M;++i)
printf("%i\n",ask[i][3]);
fclose(stdin); fclose(stdout);
return 0;
}