Cod sursa(job #685591)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 21 februarie 2012 00:17:08
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#define U unsigned
using namespace std;
const int MAX = 1 << 20;

struct per{U x, y;};
char viz[MAX];
int n, l, u;
unsigned V[MAX];
vector <per> srt;

bool Compara(per a, per b)	{return a.x < b.x;}

long long Sub(int N) {
    memset (viz, 0, sizeof (viz));
    long long nSub = 0;
    for (int i = 0, j = 0, nr = 0; j < n; j++) {
        if (viz[V[j]] == 0) nr++;
        for (viz[V[j]]++; nr > N; i++)
            if (--viz[V[i]] == 0) nr --;
        nSub += j - i + 1;
    }
    return nSub;
}

int main(){
	freopen ("secv5.in", "r", stdin), freopen("secv5.out", "w", stdout);
	scanf("%d %d %d", &n, &l, &u);
  
	int i, norm;
	for (i = 0; i < n; i++) {
    scanf ("%u", &V[i]);
    srt.push_back ((per){V[i], i});
  }
  sort (srt.begin(), srt.end(), Compara);
  for (i = 0, norm = 0; i < n; V[srt[i++].y] = norm) 
    if (i > 0 && srt[i - 1].x != srt[i].x) 
			norm++;
	
  printf ("%lld", Sub(u) - Sub(l-1));
	return 0;
}