Cod sursa(job #917907)

Utilizator lily3Moldovan Liliana lily3 Data 18 martie 2013 14:12:30
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<fstream>
#include<algorithm>
#define mod 666013
#define nmax 1<<20+1
using namespace std;

unsigned long int i,j,n,m,b[nmax],l,u,pozu[nmax],pozl[nmax],rezu,rezl=0,nr;
unsigned long int apl[nmax],nrl=0,nru=0,apu[nmax],ap[nmax];
struct ordine
{
    unsigned long long int x;
    int poz;
};
ordine a[nmax];
bool cmp(ordine a,ordine b)
{
    if(a.x==b.x)
    return a.poz<b.poz;
    return a.x<b.x;
}
int main()
{
   ifstream f("secv5.in");
   ofstream g("secv5.out");
   f>>n>>l>>u;
   --l;
   for(i=1;i<=n;++i)
   f>>a[i].x,a[i].poz=i;
   sort(a+1,a+n+1,cmp);
   for(i=1;i<=n;++i)
   {
   if(a[i].x!=a[i-1].x)
   ++nr;
   b[a[i].poz]=nr;
   }
   apl[b[1]]=apu[b[1]]=1;
   pozu[1]=pozl[1]=1;
   nrl=nru=1;
   for(i=2;i<=n;++i)
   {
       ++apl[b[i]];
       ++apu[b[i]];
       if(apl[b[i]]==1)
       ++nrl;
       if(nrl<=l)
       pozl[i]=pozl[i-1];
       else
       {
           j=pozl[i-1];
           while(nrl>l)
           {
               --apl[b[j]];
               if(!apl[b[j]])
               --nrl;
               ++j;
           }
           pozl[i]=j;
       }
       if(apu[b[i]]==1)
       ++nru;
       if(nru<=u)
       pozu[i]=pozu[i-1];
       else
       {
           j=pozu[i-1];
           while(nru>u)
           {
               --apu[b[j]];
               if(!apu[b[j]])
               --nru;
               ++j;
           }
           pozu[i]=j;
       }
       rezu+=(i-pozu[i]+1);
       rezl+=(i-pozl[i]+1);
   }
   g<<rezu-rezl<<"\n";
   return 0;
}