Cod sursa(job #2764222)

Utilizator KarinAAndrei Karina KarinA Data 19 iulie 2021 21:34:14
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream in ("secv5.in");
ofstream out ("secv5.out");

const int MOD=666013,NMAX=(1<<21);
int n,l,u;
unsigned int v[NMAX];
vector <pair<unsigned int,unsigned int>> h[MOD+5];

void pune (unsigned int x, unsigned int &k)
{
    int r;
    unsigned int i;
    r=x%MOD;
    for(i=0;i<h[r].size();i++)
    {
        if(h[r][i].first==x)
        {
            h[r][i].second++;
            break;
        }
    }
    if(i==h[r].size())
    {
        k++;
        h[r].push_back(make_pair(x,1));
    }
}

void sterge(unsigned int x, unsigned int &k)
{
    int r;
    r=x%MOD;
    int lung=h[r].size();
    for(unsigned int i=0;i<lung;i++)
    {
        if(h[r][i].first==x)
        {
            h[r][i].second--;
            if(h[r][i].second==0)
            {
                k--;
                swap(h[r][i],h[r][lung-1]);
                h[r].pop_back();
            }
            break;
        }
    }
}

long long solve(int val)
{
    unsigned int i,j,k;
    long long ans=0;
    for(i=0;i<MOD;i++)
        h[i].clear();
    j=1;
    k=0;
    for(i=1;i<=n;i++)
    {
        pune(v[i],k);
        while(k>val)
        {
            sterge(v[j],k);
            j++;
        }
        ans=ans+ 1LL*(i-j+1);
    }
    return ans;
}

int main()
{
    in>>n>>l>>u;
    for(int i=1;i<=n;i++)
        in>>v[i];
    out<<solve(u)-solve(l-1)<<'\n';
    return 0;
}