Cod sursa(job #1770360)

Utilizator mihai.alphamihai craciun mihai.alpha Data 4 octombrie 2016 09:37:26
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 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];
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];int cp[MAX];
struct elem  {
    int val;
    int pos;
};
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 u) {
  long long ans = 0LL;
  int i, j, dist = 0;
  memset(vf, 0, sizeof(vf));
  for (i = j = 0; i < n; ++i) {
    if (vf[cp[i]] == 0)
      ++dist;
    vf[cp[i]]++;
    while (dist > u) {
      vf[cp[j]]--;
      if (vf[cp[j]] == 0)
        --dist;
      ++j;
    }
    ans += 1LL*(i - j + 1);
  }
  return ans;
}

int main()  {
fin = fopen("secv5.in", "r");
fout = fopen("secv5.out", "w");
n = read();
l = read();
u = read();
int i;
for(i = 0;i < n;i++)  {
    v1[i].val = read();
    v1[i].pos = i;
    }
std::sort(v1, v1+n,cmp);
int norm;
norm = 1;
cp[v1[0].pos] = 1;
    for (i = 1; i < n; i++) {
      if(v1[i - 1].val < v1[i].val)
        norm++;
      cp[v1[i].pos] = norm;
    }

fprintf(fout, "%lld",secventa5(u) - secventa5(l - 1));
fclose(fin);
fclose(fout);
return 0;
}