Cod sursa(job #1770288)

Utilizator mihai.alphamihai craciun mihai.alpha Data 3 octombrie 2016 23:16:28
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#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;
}