Pagini recente » Cod sursa (job #1712526) | Cod sursa (job #524073) | Cod sursa (job #1220071) | Cod sursa (job #2376282) | Cod sursa (job #2151565)
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("distincte.in");
ofstream g("distincte.out");
int n,k,m,val,i,v[100005],st,dr,p,ml=0,mr=-1;
struct qu
{
int le,rg,poz,vl;
} w[100005];
void mord(int s, int d, int k)
{
for(int i=1; i<=k; i++)
{
if(s/p==w[i].le/p && d<w[i].rg)
{
for(int j=k+1; j>=i+1; j--)
{
w[j].le=w[j-1].le;
w[j].rg=w[j-1].rg;
w[j].poz=w[j-1].poz;
}
w[i].le=s;
w[i].rg=d;
w[i].poz=k;
i=k+1;
}
else if(s/p<w[i].le/p)
{
for(int j=k+1; j>=i+1; j--)
{
w[j].le=w[j-1].le;
w[j].rg=w[j-1].rg;
w[j].poz=w[j-1].poz;
}
w[i].le=s;
w[i].rg=d;
w[i].poz=k;
i=k+1;
}
}
}
int cata(int x, int y, int z)
{
int t=1;
for(int i=x; i<=y; i++)
if(z==v[i])
t=0;
return t;
}
int main()
{
f>>n>>k>>m;
p=sqrt(n); //BLOCK_SIZE=n;
for(i=1; i<=n; i++)
f>>v[i];
w[1].le=n+1;
w[1].rg=n+1;
for(i=1; i<=m; i++)
{
f>>st>>dr;
mord(st,dr,i);
}
for(i=1; i<=m; i++)
{
while(mr<w[i].rg)
{
mr++;
if(cata(ml,mr-1,v[mr])==1)
val=val+v[mr];
}
while(mr>w[i].rg)
{
mr--;
if(cata(ml,mr,v[mr+1])==1)
val=val-v[mr+1];
}
while(ml>w[i].le)
{
ml--;
if(cata(ml+1,mr,v[ml])==1)
val=val+v[ml];
}
while(ml<w[i].le)
{
ml++;
if(cata(ml,mr,v[ml-1])==1)
val=val-v[ml-1];
}
w[i].vl=val;
}
/*for(i=1; i<=m+1; i++)
g<<w[i].le<<' '<<w[i].rg<<' '<<w[i].poz<<' '<<w[i].vl<<endl;
g<<endl;*/
for(i=1;i<=m;i++)
{
k=1;
while(w[k].poz!=i)
k++;
g<<w[k].vl<<endl;
}
return 0;
}