Pagini recente » Cod sursa (job #2574127) | Cod sursa (job #2235807) | Cod sursa (job #1588908) | Cod sursa (job #2790825) | Cod sursa (job #1770288)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MOD 666013
#define MAX 1<<20
#include <algorithm>
#include <ctype.h>
#define BUF_SIZE 1 << 17//parsarea intrarii (:¬)
using namespace std;
int pos = BUF_SIZE;
FILE *fin, *fout;
char buf[BUF_SIZE];
int nra[MAX], nrb[MAX], sum[MAX];
inline char nextch(){
if(pos==BUF_SIZE) fread(buf, BUF_SIZE, 1, fin), pos=0;
return buf[pos++];
}
inline int read(){
int x=0;
char ch=nextch();
while(!isdigit(ch)) ch=nextch();
while(isdigit(ch)){
x=10*x+ch-'0';
ch=nextch();
}
return x;
}
int next[MAX], lista[MOD];unsigned int cp[MAX];
struct elem {
unsigned int val;
unsigned int cpy;
int pos;
int norm;
};
elem v1[MAX];
int n, l, u;
bool cmp(elem A, elem B) {
return A.val > B.val;
}
int vf[MAX];
long long secventa5(int last) {
long long ans;
ans = 0;
int i, j = 0, lg;
lg = 0;
memset(vf, 0, sizeof(vf));
for (i = 0; i < n; i++) {
if (vf[cp[i]] == 0)
lg++;
vf[cp[i]]++;
while (lg > last) {
vf[cp[j]]--;
if (vf[cp[j]] == 0)
lg--;
j++;
}
ans += 1LL*(i - j + 1);
}
return ans;
}
int compar(const void *a, const void*b) {
return *(int*)a - *(int*)b;
}
int main() {
fin = fopen("secv5.in", "r");
fout = fopen("secv5.out", "w");
n = read();
l = read();
u = read();
int i;
for(i = 1;i <= n;i++) {
//fscanf(fin, "%d", &v1[i].val);
v1[i].val = read();
cp[i] = v1[i].val;
v1[i].cpy = v1[i].val;
v1[i].pos = i;
}
std::sort(v1+1, v1+n+1,cmp);
int curent = 1;
int last;
last = v1[1].val;
for(i = 1;i <= n;i++) {
//fprintf(fout, "%d %d\n", v1[i].val, v1[i].pos);
if(last != v1[i].val)
curent++;
v1[i].norm = curent;
cp[v1[i].pos] = curent;
last = v1[i].val;
}
for(i = 1;i <= n;i++) {
cp[i] = curent - cp[i] + 1;
sum[i] = sum[i - 1] + cp[i];
}
//int rez = 0;
//for(i = 1;i <= n;i++) {
//sum[i] = sum[i - 1] + cp[i];
//if(i >= l)
// nra[sum[i - l]]++;
// if(i >= u+1)
// nrb[sum[i - u - 1]]++;
// rez += (nra[sum[i]] - nrb[sum[i]]);
// printf("%d %d\n", nra[sum[i]], nrb[sum[i]]);
//}
qsort(cp, n+1,sizeof(int), compar);
fprintf(fout, "%d", secventa5(u) - secventa5(l-1));
fclose(fin);
fclose(fout);
return 0;
}