Cod sursa(job #918016)

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

unsigned  int i,j,n,m,b[nmax],l,u,pozu[nmax],pozl[nmax],nr,rez=0;
unsigned int apl[nmax],nrl=0,nru=0,apu[nmax];
struct ordine
{
    unsigned long long int x;
    unsigned 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 modul(int x)
{
    return max(x,-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;
   }
    pozl[0]=pozu[0]=1;
   for(i=1;i<=n;++i)
   {
       ++apl[b[i]];
       ++apu[b[i]];
       if(apl[b[i]]==1)
       ++nrl;
           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;
           j=pozu[i-1];
           while(nru>u)
           {
               --apu[b[j]];
               if(!apu[b[j]])
               --nru;
               ++j;
           }
           pozu[i]=j;
       rez+=modul((i-pozu[i]+1)-(i-pozl[i]+1));
   }
   g<<rez<<"\n";
   return 0;
}