Cod sursa(job #1313665)

Utilizator gapdanPopescu George gapdan Data 10 ianuarie 2015 22:29:48
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<cstdio>
#include<vector>
#define MOD 666013
#define NMAX 1<<20+2
using namespace std;
int n,l,u;
unsigned int v[NMAX];
struct structura
{
    unsigned int l,r;
};
vector<structura>H[MOD+100];
short cauta(int x)
{
    int i;
    int r=x%MOD;
    for(i=0;i<H[r].size();++i)
        if (H[r][i].l==x) return i;
    return -1;
}
void add(int x,int poz)
{
    int r=x%MOD;
    if (poz==-1)
    {
        structura X;
        X.l=x;X.r=1;
        H[r].push_back(X);
    }
    else ++H[r][poz].r;
}
int sterge(int x)
{
    int r=x%MOD;
    int ok=0,i=0;
    int k=0;
    vector<structura>::iterator it;
    it=H[r].begin();
    while (it!=H[r].end())
    {
        structura X=*it;
        if (X.l==x)
        {
            --H[r][i].r;
            if (H[r][i].r==0) {H[r].erase(it);return 0;}
                else return 1;
        }
        else {++it;++i;}
    }
    return 0;
}
long long sol(unsigned int x)
{
    int i,j,nr=0;
    long long rez=0;
    for (i=0;i<MOD;++i)
        H[i].clear();
    for (i=1,j=1;i<=n;++i)
    {
        int poz=cauta(v[i]);
        if (poz==-1) ++nr;
        add(v[i],poz);
        while(nr>x)
        {
            int cat=sterge(v[j]);
            if (cat==0) --nr;
            ++j;
        }
        rez+=(i-j+1);
    }
    return rez;
}
int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&l,&u);
    for (int i=1;i<=n;++i)
        scanf("%u",&v[i]);
    printf("%lld\n",sol(u)-sol(l-1));
    return 0;
}