Cod sursa(job #1836041)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 27 decembrie 2016 18:49:26
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cstring>
#include <map>
#include <iomanip>
#include <unordered_map>
#include <stack>
#include <bitset>
#include <cctype>
#define MOD 666013
#define pb push_back
#define INF 0x3f3f3f3f
#define INFLL (1LL*INF*INF)
#define ll long long
#define NMAX 1100000

using namespace std;

typedef pair<int, int> pii;

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

int v[NMAX],aparitii[NMAX];
vector<pii> Hash[NMAX];

int findHash(int x) {
	int lista=x%MOD;

	for(auto it:Hash[lista]) if(it.first==x) return it.second;
	return 0;
}

void insertHash(int x, int nrord) {
	int lista=x%MOD;

	Hash[lista].pb({x,nrord});
}

ll atmost(int n, int limita) {
	int i,st=1,diferite=0;
	ll res=1LL*n*(n+1)/2;

	for(i=1;i<=n;++i) {
		if(aparitii[v[i]]==0) ++diferite;

		++aparitii[v[i]];
		while(diferite>limita) {
			--aparitii[v[st]];
			if(aparitii[v[st]]==0) --diferite;

			++st;
		}
		res-=st-1;
	}

	memset(aparitii,0,sizeof(aparitii));

	return res;
}

int main(){
	int n,l,u,i,nrord=0,x,normalizat;

	fin>>n>>l>>u;

	for(i=1;i<=n;++i) {
		fin>>x;

		normalizat=findHash(x);
		if(normalizat==0) {
			++nrord;
			insertHash(x,nrord);
			v[i]=nrord;
		}
		else v[i]=normalizat;
	}

	fout<<atmost(n,u)-atmost(n,l-1);

	return 0;
}