Cod sursa(job #2885058)

Utilizator AACthAirinei Andrei Cristian AACth Data 5 aprilie 2022 14:45:40
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
#define cin f
#define cout g
// #define int long long
const int Max = 1<<20 + 1;
void nos()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}
int n,l,u;
unsigned int a[Max];
vector < int > all;
int norma(int val)
{
	 auto it = lower_bound(all.begin(), all.end(),val);
	 return distance(all.begin(),it) + 1;
}
int valnorma[Max];

void read()
{
	f>>n>>l>>u;
	int i;
	
	for(i=1;i<=n;i++)
	{
		f>>a[i];
		all.push_back(a[i]);
	}
	sort(all.begin(), all.end());
 	all.erase(unique(all.begin(), all.end()),all.end());
 	for(i=1;i<=n;i++)
 	{
 		valnorma[i] = norma(a[i]);
 	}
}
int fr[Max];
long long get_val(int k)
{
	for(int i = 1;i<=all.size();i++)
		fr[i] = 0;
	if(k == 0)
		return 0LL;
	long long ans = 0;
	int i;
	int len = 0;
	int j = 1;
	for(i=1;i<=n;i++)
	{
		fr[valnorma[i]]++;
		if(fr[valnorma[i]] == 1) len ++;
		while(len > k)
		{
			fr[valnorma[j]] --;
			if(fr[valnorma[j]] == 0)
				len --;
			j++; 
		}
		ans += i - j + 1;	
	}
	return ans;
}
 
void solve()
{
    g << get_val(u) - get_val(l - 1);
}
void restart()
{
 
}
int32_t main()
{
    nos();
 
        read();
        solve();
        restart();
    
    return 0;
}