Pagini recente » Istoria paginii propuneri/9-okr | Borderou de evaluare (job #3264695) | Cod sursa (job #2862435) | Cod sursa (job #1949283) | Cod sursa (job #1779220)
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int nmax=100000;
struct nod
{
long long sum;
nod * fiust,*fiudr;
nod()
{
sum=0;
fiust=fiudr=NULL;
};
};
struct sp
{
long long ans;
int st,dr,po;
} inter[nmax+5];
int in[nmax+5],lv[nmax+5],last[nmax+5];
long long ai[nmax+5];
void prop(nod * rot)
{
if(rot->fiust==NULL)
rot->fiust=new nod();
if(rot->fiudr==NULL)
rot->fiudr=new nod();
}
int lsb(int i)
{
return i & (-i);
}
void update(int le,int ri,int val)
{
int i;
for(i=le-1;i>0;i=i-lsb(i))
ai[i]-=val;
for(i=ri;i>0;i=i-(lsb(i)))
ai[i]+=val;
}
bool cmp(sp a1,sp a2)
{
return a1.dr<a2.dr;
}
long long query(int st,int dr)
{
int i;
long long ans=0;
for(i=st;i<=nmax;i=i+lsb(i))
ans+=ai[i];
for(i=dr+1;i<=nmax;i=i+lsb(i))
ans-=ai[i];
return ans;
}
bool ini(sp a1,sp a2)
{
return a1.po<a2.po;
}
int main()
{
freopen("distincte.in","r",stdin);
freopen("distincte.out","w",stdout);
int n,m,k,i,j;
nod * root=new nod();
scanf("%d%d%d",&n,&k,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&in[i]);
last[i]=lv[in[i]];
lv[in[i]]=i;
}
for(i=1; i<=m; i++)
{
scanf("%d%d",&inter[i].st,&inter[i].dr);
inter[i].po=i;
}
sort(inter+1,inter+m+1,cmp);
for(i=1; i<=m; i++)
{
for(j=inter[i-1].dr+1; j<=inter[i].dr; j++)
{
update(1,j,in[j]);
if(last[j]!=0)
update(1,last[j],-in[j]);
}
inter[i].ans=query(inter[i].st,inter[i].dr);
}
sort(inter+1,inter+m+1,ini);
for(i=1; i<=m; i++)
cout<<inter[i].ans<<"\n";
return 0;
}