Cod sursa(job #988647)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 23 august 2013 15:45:05
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include<fstream>
using namespace std;
typedef unsigned int uni;
const uni mod = 666013;
typedef struct celula{
            uni val,nr;
            celula *next;
            }*lista;
lista h1[666013],h2[666013];
uni x,nr,l,u,p1,p2,s,i,n,a[1050000];
long long sol;
bool ok;

void baga1(uni x) {
     uni 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(uni x) {
     uni 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(uni x) {
     uni 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) {
          uni 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);
}