Cod sursa(job #1783608)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 19 octombrie 2016 10:17:08
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = (1 << 20) + 10;

int n, l, r;
int a[nmax], ap[nmax];

map < int, int > idx;

long long ans;

void read_input()
{
    freopen("secv5.in","r",stdin);

    int cnt = 0;

    scanf("%d %d %d", &n, &l, &r);
    for (int i = 1; i <= n; ++i)
    {
        long long x;
        scanf("%lld", &x);

        if (idx.count(x) == 0)
            idx[x] = ++cnt;
        a[i] = idx[x];
    }
}

long long answer(int x)
{
    int left = 1, cnt = 0;
    long long ret = 0;

    for (int i = 1; i <= n; ++i)
        ap[a[i]] = 0;

    for (int i = 1; i <= n; ++i)
    {
        ap[a[i]]++;
        if (ap[a[i]] == 1)
            cnt++;

        while (cnt > x)
        {
            ap[a[left]]--;
            if (ap[a[left]] == 0) cnt--;
            left++;
        }

        ret += (i - left + 1);
    }

    return ret;
}

void solve()
{
    ans = answer(r) - answer(l - 1);
}

void print_answer()
{
    freopen("secv5.out","w",stdout);
    printf("%d\n", ans);
}

int main()
{
    read_input();
    solve();
    print_answer();

    return 0;
}