Cod sursa(job #2751836)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 15 mai 2021 21:48:28
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
/*#include <bits/stdc++.h>
#pragma GCC optimize("O2")
using namespace std;
const int N = (1<<20)+1;
unsigned int v[N];

int main()
{

	unordered_map <unsigned int, int> lvec;
	unordered_map <unsigned int, int> uvec;
	ifstream cin("secv5.in");
	ofstream cout("secv5.out");

	int n,u,l;
	cin>>n>>l>>u;
	unsigned int upoint=0;
	unsigned int lpoint=0;

	long long ans=0;

	for(int i=0;i<n;i++)
	{
		cin>>v[i];
		if(lvec.find(v[i])==lvec.end())
			lvec[v[i]]=1;
		else
			lvec[v[i]]++;
		if(uvec.find(v[i])==uvec.end())
			uvec[v[i]]=1;
		else
			uvec[v[i]]++;
		while(lpoint<=i and lvec.size()>=l)
		{
			if(lvec[v[lpoint]]==1)
					lvec.erase(v[lpoint]);
			else
				lvec[v[lpoint]]--;
			lpoint++;
		}
		while(upoint<=i and uvec.size()>u)
		{
			if(uvec[v[upoint]]==1)
				uvec.erase(v[upoint]);
			else
				uvec[v[upoint]]--;
			upoint++;
		}
		if(lpoint>upoint)
			ans+=lpoint-upoint;
	}
	cout<<ans<<'\n';
	return 0;
}*/
#include <bits/stdc++.h>
using namespace std;
unordered_map <long long, long long > mp;
const int N=(1<<20)+1;
long long v[N],n;
long long f[N];
long long rez(long long d)
{
    long long ans=0;
    if(d==0)
	   	return ans;
    memset(f,0,sizeof(f));
    long long cnt=0,st=1;
    for(long long dr=1;dr<=n;++dr)
    {
        if(f[v[dr]]==0)
            cnt++;
        f[v[dr]]++;
        if(cnt<=d)
			ans+=(dr-st+1);
        else
        {
            while(cnt>d)
            {
                f[v[st]]--;
                if(f[v[st]]==0)
				   cnt--;
                st++;
            }
            ans+=(dr-st+1);
        }
    }
    return ans;
}
int main()
{
	ifstream cin("secv5.in");
	ofstream cout("secv5.out");
	long long l,u;
	cin>>n>>l>>u;
	long long cnt=0;
	for(long long i=1;i<=n;i++)
	{
		cin>>v[i];
		if(mp[v[i]]==0)
		{
			mp[v[i]]=++cnt;
			v[i]=cnt;
		}
		else
			v[i]=mp[v[i]];
	}
	mp.clear();
	cout<<rez(u)-rez(l-1);
	return 0;
}