Cod sursa(job #1136166)

Utilizator sddddgjdZloteanu Anastasia sddddgjd Data 8 martie 2014 21:06:46
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#include<algorithm>
#define N 1048576
unsigned int v[N],orig[N],ap[N],n;
int cautbin(unsigned int st,unsigned int dr,unsigned int val)
{
    unsigned int mij=(st+dr)/2;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(orig[mij]==val)
            return mij;
        else
            if(orig[mij]<val)
                st=mij+1;
            else
                dr=mij-1;
    }
    return 0;
}
long long getsecv(unsigned int val)
{
    long long secv=0;
    unsigned int i;
    for(i=0;i<N;i++)
        ap[i]=0;
    unsigned int j,nr=0;
    i=0;
    for(j=0;j<n;j++)
    {
        if(ap[v[j]]==0)
            nr++;
        ap[v[j]]++;
        while(nr>val)
        {
            ap[v[i]]--;
            if(ap[v[i]]==0)
                nr--;
            i++;
        }
        secv+=j-i+1;
    }
    return secv;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("secv5.in","r");
    fout=fopen("secv5.out","w");
    unsigned int l,u;
    fscanf(fin,"%d%d%d",&n,&l,&u);
    unsigned int i;
    for(i=0; i<n; i++)
    {
        fscanf(fin,"%d",&v[i]);
        orig[i]=v[i];
    }
    i=0;
    unsigned int poz=0;
    std::sort(orig,orig+n);
    while(i<n)
    {
        while(orig[poz]==orig[i]&&i<n)
            i++;
        if(i<n)
            orig[++poz]=orig[i];
        i++;
    }
    for(i=0;i<n;i++)
        v[i]=cautbin(0,poz,v[i]);
    fprintf(fout,"%lld",getsecv(u)-getsecv(l-1));
    return 0;
}