Cod sursa(job #1058391)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 15 decembrie 2013 14:44:25
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
 const int mod=666013,vmax=(1<<20)+5;
 long long v[vmax];
 long long n,l,u,limx[vmax],limy[vmax],dx,dy,dist,sol=0;
  vector <long long> h[mod],ap[mod];

void Read()
{ int i;
    f>>n>>l>>u;
  for(i=1;i<=n;i++)
   f>>v[i];
}

void Del(int x)
{ int i,l=x%mod;
  for(i=0;i<h[l].size();i++)
   if (h[l][i]==x)
   { if (ap[l][i]) ap[l][i]--;
     if (!ap[l][i])
     { h[l][i]=h[l][h[l].size()-1];
       ap[l][i]=ap[l][ap[l].size()-1];
       h[l].pop_back();
       ap[l].pop_back();
        dist--;
     }
   }
}

void Add(int x)
{ int i,l=x%mod,found=0;
   for(i=0;i<h[l].size();i++)
    if (h[l][i]==x)
     {ap[l][i]++;
      found=1;}

 if (!found)
 { dist++;
   h[l].push_back(x);
   ap[l].push_back(1);
 }

}
void Solve()
{ int i;
    dx=0; dist=0;
   for(i=1;i<=n;i++)
   {
     if (i>1) Del(v[i-1]);

     while(dist<l && dx+1<=n)
      {dx++; Add(v[dx]);}

     if (dist>=l)
      limx[i]=dx;
       else limx[i]=-1;

     //cout<<limx[i]<<"\n";
   }
     Del(v[n]);
       dist=0; dx=0;
   for(i=1;i<=n;i++)
   {
     if (i>1) Del(v[i-1]);

     while(dist<=u && dx+1<=n)
      {dx++; Add(v[dx]);}
        if (dist>u) {Del(v[dx]); dx--;}

     if (dist>=l)
      limy[i]=dx;
       else limy[i]=-1;

     //cout<<limy[i]<<"\n";
   }
     Del(v[n]);

  for(i=1;i<=n;i++)
   if (limx[i]!=-1 && limy[i]!=-1)
    sol+=limy[i]-limx[i]+1;
}
int main()
{ Read();
  Solve();
   g<<sol<<"\n";
    return 0;
}