Cod sursa(job #12782)

Utilizator mariusdrgdragus marius mariusdrg Data 4 februarie 2007 19:10:08
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>
#include<algorithm>
#define LL long long

using namespace std;

const int maxn = 1048576;

unsigned int i;
unsigned int l[maxn];
unsigned int n;
unsigned int v[maxn];
unsigned int a[maxn];
unsigned int cnt;
unsigned int s;
unsigned int t;
unsigned int cont[maxn];
unsigned int b[maxn];

long long calc(unsigned int x)
{

        if (x==0) return 0;
        l[0]=1;
        memset(v,0,sizeof(v));
        cnt=0;
        for(i=0;i<=n-1;i++)
        {
                l[i]=l[i-1];
                v[a[i]]++;
                if (v[a[i]]==1) cnt++;
                while(cnt>x)
                {
                        l[i]++;
                        v[a[l[i]-1]]--;
                        if (v[a[l[i]-1]]==0) cnt--;
                }
        }
        long long sum=0;
        for(i=0;i<=n-1;i++)
                sum+=(long long)((LL)i-l[i]+1);

        return sum;
}

unsigned int bs(unsigned int i)
{
        unsigned int p,x=0;
        for(p=1;p<=n-1;p<<=1);
        for(;p;p>>=1)
                if (b[x+p]<=i&&x+p<=n-1) x+=p;
        return x;
}


int main()
{
        freopen("secv5.in","r",stdin);
        freopen("secv5.out","w",stdout);
        scanf("%d %d %d",&n,&s,&t);
        for(i=0;i<=n-1;i++)
        {
                scanf("%d",&a[i]);
                b[i]=a[i];
        }
        sort(b,b+n);
        cont[0]=1;
        for(i=1;i<=n-1;i++)
        {
                if (b[i]!=b[i-1])
                {
                        cont[i]=cont[i-1]+1;
                }
                else cont[i]=cont[i-1];
        }
        for(i=0;i<=n-1;i++)
        {
                a[i]=cont[bs(a[i])];
        }
        long long sol;
        
        sol=(long long)calc(t)-(LL)calc(s-1);
        printf("%lld",sol);

        return 0;
}