Pagini recente » Cod sursa (job #337396) | Cod sursa (job #2227155) | Cod sursa (job #703387) | Cod sursa (job #1322845) | Cod sursa (job #1760725)
#include<cstdio>
#include<vector>
const unsigned int MAXN=1<<21,MOD1=117802,MOD2=28491;
unsigned int v[MAXN];
std::vector<std::pair<unsigned int,unsigned int> > map[MOD1];
unsigned int Get_Pos(unsigned int x)
{
unsigned int r1=x%MOD1,r2=x%MOD2;
for(unsigned int pos=0;pos<map[r1].size();pos++)
{
if(map[r1][pos].first==r2)
return pos;
}
return -1;
}
unsigned int Get_Val(unsigned int x)
{
unsigned int pos=Get_Pos(x);
unsigned int r1=x%MOD1,r2=x%MOD2;
if(pos==-1 || map[r1][pos].second==0)
return -1;
else
return map[r1][pos].second;
}
bool Add(unsigned int x)
{
unsigned int pos=Get_Pos(x);
unsigned int r1=x%MOD1,r2=x%MOD2;
if(pos==-1)
{
map[r1].push_back(std::make_pair(r2,1));
return true;
}
else
{
map[r1][pos].second++;
return (map[r1][pos].second==1);
}
}
bool Decrease(unsigned int x)
{
unsigned int pos=Get_Pos(x);
unsigned int r1=x%MOD1,r2=x%MOD2;
if(pos==-1 || map[r1][pos].second==0)
return false;
else
map[r1][pos].second--;
return (map[r1][pos].second==0);
}
unsigned int n,l,u;
long long Numara(unsigned int val)
{
unsigned int st=1,dr,dif=0;
long long rasp=0ll;
for(dr=1;dr<=n;dr++)
{
dif+=Add(v[dr]);
while(dif>val)
{
dif-=Decrease(v[st]);
st++;
}
rasp=rasp+dr-st+1;
}
for(int i=1;i<=n;i++)
Decrease(v[i]);
return rasp;
}
int main()
{
FILE *file=fopen("secv5.in","r");
fscanf(file,"%u %u %u",&n,&l,&u);
for(unsigned int i=1;i<=n;i++)
{
fscanf(file,"%u ",&v[i]);
}
fclose(file);
file=fopen("secv5.out","w");
fprintf(file,"%lld\n",Numara(u)-Numara(l-1));
fclose(file);
return 0;
}