Pagini recente » Cod sursa (job #2528795) | Cod sursa (job #984342) | Cod sursa (job #714420) | Cod sursa (job #2176497) | Cod sursa (job #1766388)
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
typedef unsigned int uint;
const uint mod=99017;
vector< pair<uint,int> > h[mod+5];
uint x,key;
int v[(1<<20)+5],n,p,u,i,i1,i2,j,neww,ap1[(1<<20)+5],ap2[(1<<20)+5],dist1,dist2;
long long tot;
bool moved;
void ins()
{
key=x%mod;
for(j=0;j<h[key].size();j++)
if(h[key][j].first==x)
{
v[i]=h[key][j].second;
return;
}
neww++;
v[i]=neww;
h[key].push_back(make_pair(x,neww));
}
int main()
{
ifstream f("secv5.in");
ofstream g("secv5.out");
f>>n>>p>>u;
for(i=1;i<=n;i++)
{
f>>x;
ins();//facem hash pt a normaliza
//in O(n)
}
i1=1;i2=1;
/*aflam secventelecu cel mult u elemente distincte
si scadem din ele pe cele cu cel mult p1elemente distincte*/
for(i=1;i<=n;i++)
{
if(ap1[v[i]]==0)
dist1++;
if(ap2[v[i]]==0)
dist2++;
ap1[v[i]]++;
ap2[v[i]]++;
while(dist1>p-1)
{
if(ap1[v[i1]]==1) dist1--;
ap1[v[i1]]--;
i1++;//cel mult p-1
}
while(dist2>u)
{
if(ap2[v[i2]]==1) dist2--;
ap2[v[i2]]--;
i2++;//cel mult u
}
if(i1!=0)tot+=i1-i2;//adaugarea
}
g<<tot;
return 0;
}