Cod sursa(job #2885044)

Utilizator AACthAirinei Andrei Cristian AACth Data 5 aprilie 2022 14:33:17
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 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);
}
FILE *fin = fopen("secv5.in", "r");
 
const int bsize = 1<<16; //bsize = dimensiunea blocurilor in care sparg fisierul de intrare
char buff[bsize];
int poz = bsize;
 
inline char next() //citeste urmatorul caracter
{
    if (poz == bsize) //daca am terminat de procesat blocul actual, mai citesc inca un bloc
    {
        fread(buff, 1, bsize, fin);
        poz = 0;
    }
    return buff[poz++];
}
 
int nr() //citeste un numar pozitiv
{
    int x = 0;
    char c;
    do
    {
        c = next();
    } while (isdigit(c) == 0); //sar peste spatii
    while (isdigit(c)) //citesc cifra cu cifra
    {
        x = x * 10 + c-48;
        c = next();
    }
    return x;
}

int n,l,u;
unsigned int a[Max];
void read()
{
	f>>n>>l>>u;
	int i;
	for(i=1;i<=n;i++)
		a[i] = nr();
}
long long get_val(int k)
{
	if(k == 0)
		return 0LL;
	long long ans = 0;
	int i;
	unordered_map < unsigned int , int > fr;
	int len = 0;
	int j = 1;
	for(i=1;i<=n;i++)
	{
		fr[a[i]]++;
		if(fr[a[i]] == 1) len ++;
		while(len > k)
		{
			fr[a[j]] --;
			if(fr[a[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;
}