Pagini recente » Cod sursa (job #699729) | Cod sursa (job #701631) | Monitorul de evaluare | Cod sursa (job #609244) | Cod sursa (job #988641)
Cod sursa(job #988641)
#include<fstream>
using namespace std;
const int mod = 666013;
typedef struct celula{
long long val;
int nr;
celula *next;
}*lista;
lista h1[666013],h2[666013];
unsigned int i,n,x,nr,l,u,p1,p2,s;
long long sol,a[2100000];
bool ok;
void baga1(int x) {
int poz=x%mod; bool aux=1;
for (lista p=h1[poz]; p; p=p->next)
if (p->val==x) {
++p->nr; aux=0; if (p->nr==1) ok=0; break;
}
if (aux) { ok=0;
lista v=new celula; v->nr=1; v->val=x; v->next=h1[poz]; h1[poz]=v;
}
}
void baga2(int x) {
int poz=x%mod; bool aux=1;
for (lista p=h2[poz]; p; p=p->next)
if (p->val==x) {
++p->nr; aux=0; if (p->nr==1) ok=0; break;
}
if (aux) { ok=0;
lista v=new celula; v->nr=1; v->val=x; v->next=h2[poz]; h2[poz]=v;
}
}
void scoate(int x) {
int poz=x%mod;
for (lista p=h2[poz]; p; p=p->next)
if (p->val==x&&p->nr>1) {
--p->nr; break;
}
else if (p->val==x&&p->nr==1) { --p->nr; ok=0; break; }
for (lista p=h1[poz]; p; p=p->next)
if (p->val==x) { --p->nr; break; }
}
int main(void) {
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin>>n>>l>>u;
for (i=1; i<=n; ++i) fin>>a[i];
// primul pas
for (i=1; nr<=u&&i<=n+1; ++i) {
ok=1; baga1(a[i]);
if (ok==0) ++nr;
if (p1==0) baga2(a[i]);
if (nr==l&&p1==0) p1=i;
}
//inaintez cu segvente bune
p2=i-1; s=1;
while (p1<=n) {
long long v=p2-p1;
ok=1;
while (ok) {
sol+=v;
scoate(a[s]);
++s;
}
ok=1;
while (ok&&p1<=n) {
++p1; baga2(a[p1]);
}
ok=1;
while (ok&&p2<=n) {++p2; baga1(a[p2]); }
}
fout<<sol;
return(0);
}