Pagini recente » Cod sursa (job #1958475) | Cod sursa (job #2989191) | Cod sursa (job #1585506) | Cod sursa (job #3225938) | Cod sursa (job #3222017)
#include <fstream>
#include <algorithm>
using namespace std;
class OutParser {
private:
FILE *fout;
char *buff;
int sp;
void write_ch(char ch) {
if (sp == 50000) {
fwrite(buff, 1, 50000, fout);
sp = 0;
buff[sp++] = ch;
} else {
buff[sp++] = ch;
}
}
public:
OutParser(const char* name) {
fout = fopen(name, "w");
buff = new char[50000]();
sp = 0;
}
~OutParser() {
fwrite(buff, 1, sp, fout);
fclose(fout);
}
OutParser& operator << (int vu32) {
if (vu32 <= 9) {
write_ch(vu32 + '0');
} else {
(*this) << (vu32 / 10);
write_ch(vu32 % 10 + '0');
}
return *this;
}
OutParser& operator << (long long vu64) {
if (vu64 <= 9) {
write_ch(vu64 + '0');
} else {
(*this) << (vu64 / 10);
write_ch(vu64 % 10 + '0');
}
return *this;
}
OutParser& operator << (char ch) {
write_ch(ch);
return *this;
}
OutParser& operator << (const char *ch) {
while (*ch) {
write_ch(*ch);
++ch;
}
return *this;
}
};
ifstream fin ("distincte.in");
OutParser fout("distincte.out");
int n,k,m,i,V[100003],f[100003],st;
long long sol[100003],A[100003];
const long long MOD=666013;
struct elem
{
int st,dr,ind;
}Q[100003];
void update(int poz,int val)
{
if(!poz)
return;
for(poz;poz<=n;poz+=(poz&(-poz)))
A[poz]+=val;
}
long long query(int poz)
{
if(!poz)
return 0;
long long S=0;
for(poz;poz;poz-=(poz&(-poz)))
S+=A[poz];
return S;
}
int main()
{
fin>>n>>k>>m;
for(i=1;i<=n;i++)
fin>>V[i];
for(i=1;i<=m;i++)
{
fin>>Q[i].st>>Q[i].dr;
Q[i].ind=i;
}
sort(Q+1,Q+m+1,[](elem a,elem b){return a.dr<b.dr;});
st=1;
for(i=1;i<=m;i++)
{
while(st<=Q[i].dr)
{
update(f[V[st]],-V[dr]);
f[V[st]]=dr;
update(f[V[st]],V[dr]);
st++;
}
sol[Q[i].ind]=(query(Q[i].dr)-query(Q[i].st-1))%MOD;
if(sol[Q[i].ind]<0)
sol[Q[i].ind]+=MOD;
}
for(i=1;i<=m;i++)
fout<<sol[i]<<"\n";
return 0;
}