Cod sursa(job #1058406)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 15 decembrie 2013 15:02:47
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 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,fr[(1<<20)+5];
   long long sol=0;


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)
{ fr[x]--;
   if (!fr[x]) dist--;
}

void Add(int x)
{ if (!fr[x]) dist++;
    fr[x]++;
}

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