Cod sursa(job #1847932)

Utilizator PondorastiAlex Turcanu Pondorasti Data 15 ianuarie 2017 11:30:11
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX=1100000;
unsigned int v[NMAX+5],f[NMAX+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(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(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;}