Cod sursa(job #14728)

Utilizator georgianaGane Andreea georgiana Data 9 februarie 2007 16:14:20
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>
#include <string.h>

unsigned long int n,l,u,st1,nrst1,st2,nrst2,nrSecv,v[1050000],a[1050000];

void qSort(int st,int dr)
{
     int i=st, j=dr;
     unsigned long int m=v[(i+j)/2];
     do
     {
         while (v[i]<m) i++;
         while (v[j]>m) j--;
         if (i<=j)
         {
             unsigned int aux=v[i]; v[i]=v[j]; v[j]=aux;
             i++; j--;         
         }
     } 
     while (i<=j);
     if (st<j) qSort(st,j);
     if (i<dr) qSort(i,dr);
}

int main()
{
   freopen("secv5.in","r",stdin);
   scanf("%lu %lu %lu",&n,&l,&u);
   for (int i=0;i<n;i++) scanf("%lu",&a[i]),v[i]=a[i];
   qSort(0,n-1);
   int poz=1;
   for (int i=1;i<n;i++)
      if (v[i]>v[i-1]) v[poz++]=v[i];
   for (int i=0;i<n;i++)
      {
         int st=0,dr=poz-1;
         while (st<=dr)
           {
              int m=(st+dr)/2;
              if (v[m]==a[i]) st=m,dr=st-1;
              else if (v[m]<a[i]) st=m+1;
                   else dr=m-1;
           }
        a[i]=st;
      }
   memset(v,0,sizeof(v));
   v[a[0]]=1;
   st1=0; nrst1=1;
   st2=0; nrst2=1;
   if (l==1) nrSecv=1;
   else nrSecv=0;
   for (int i=1;i<n;i++)
      {
         if (v[a[i]]) v[a[i]]++;
         else {
                 v[a[i]]=1;
                 nrst1++; nrst2++;
                 while (nrst1>u) {
                                    v[a[st1]]--;
                                    if (v[a[st1]]==0) nrst1--;
                                    st1++;
                                 }
                 while (nrst2>l) {
                                    v[a[st2]]--;
                                    if (v[a[st2]]==0) nrst2--;
                                    st2++;
                                 }
              }
         while (v[a[st2]]>1) v[a[st2++]]--;
         if (nrst2>=l) nrSecv+=st2-st1+1;
      }

   freopen("secv5.out","w",stdout);
   printf("%d\n",nrSecv);
   fclose(stdout);
   return 0;
}