Cod sursa(job #1848903)

Utilizator PondorastiAlex Turcanu Pondorasti Data 16 ianuarie 2017 20:07:31
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX=1100000,FMAX=4294967296;
unsigned int v[NMAX+5],f[FMAX+5];
unsigned int n,u,l,x,k=0,nr;
struct Pozitie {
    unsigned int nr,poz;
}a[NMAX+5];
bool Comp(Pozitie a, Pozitie b) {
    return a.nr<b.nr;}
long long Solve(unsigned int l) {
    int length=0;
    int st=1;
    long long ans=0;
    for(int dr=1;dr<=n;dr++) {
        if(f[v[dr]]==0)
           length++;
        f[v[dr]]++;
        while(length>l) {
            f[v[st]]--;
            if(f[v[st]]==0)
                length--;
            st++;}
        ans+=1LL*(dr-st+1);}
    return ans;}
int main() {
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    long long ans1=0,ans2=0,ans;
    scanf("%d%d%d",&n,&u,&l);
    for(unsigned int i=1;i<=n;i++) {
        scanf("%d",&x);
        a[i].nr=x;
        a[i].poz=i;}
    sort(a+1,a+1+n,Comp);
    for(unsigned int i=1;i<=n;i++) {
        if(a[i].nr!=a[i-1].nr )
            k++;
        v[a[i].poz]=k;}
    ans1=Solve(l);
    memset(f,0,sizeof(f));
    ans2=Solve(u-1);
    ans=ans1-ans2;
    printf("%lld",ans);
return 0;}