Cod sursa(job #1058403)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 15 decembrie 2013 15:00:18
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
 const int mod=666013,vmax=(1<<20)+5;

 struct vec
 {unsigned int val,pos;} norm[vmax];

  bool comp(vec x,vec y)
  {return x.val<y.val;};



  int v[vmax];
   int n,l,u,limx[vmax],limy[vmax],dx,dy,dist;
   long long sol=0;
  vector <int> h[mod],ap[mod];

void Read()
{ int i,ord;
    f>>n>>l>>u;

  for(i=1;i<=n;i++)
   { f>>norm[i].val;
     norm[i].pos=i; }

  sort(norm+1,norm+n+1,comp);

   ord=1; v[norm[1].pos]=ord;
  for(i=2;i<=n;i++)
  { if (norm[i].val>norm[i-1].val)
       ord++;
    v[norm[i].pos]=ord;
  }

}

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;
}