Cod sursa(job #1290266)

Utilizator sulzandreiandrei sulzandrei Data 11 decembrie 2014 00:10:43
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 1.73 kb
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define mod 666013
#define max 1<<20

vector<int>b;
vector < pair <unsigned int, int> > Hash[666014];
int N,L,U;
unsigned int viz[max];
int search(unsigned int);
void open_files(){

    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);

}
void read(){

    scanf("%d %d %d", &N, &L, &U);
    int norm=0;
    for (int i=0;i<N;++i){
        unsigned int x;
        scanf("%u", &x);

        //int rez=search(x);
        int cheie=x%mod,rez=-1;
        int ok=1;
        for (int i=0;i<Hash[cheie].size() && ok;++i)
            if (Hash[cheie][i].first==x){
                rez=Hash[cheie][i].second;
                ok=0;
            }
        if (rez==-1){
            Hash[cheie].push_back(make_pair(x,norm));
            b.push_back(norm++);
        }
        else {
            b.push_back(rez);
        }

    }

}
long long solve_subseq(int);
void write();
int main()
{

    open_files();
    read();
    write();

    return 0;
}

//int search(unsigned int x){
//
//  int cheie=x%mod;
//  for (int i=0;i<Hash[cheie].size();++i){
//      if (Hash[cheie][i].first==x)
//          return Hash[cheie][i].second;
//  }
//  return -1;
//}
long long solve_subseq(int x){
/*
    for (int i=0;i<b.size();++i)
        viz[i]=0;*/


    int nr=0,j=0,i=0;
    long long rez=0;

    for (;i<N;++i){
        if (!viz[b[i]])
            nr++;
        viz[b[i]]++;
        for (; nr>x; j++){
            viz[b[j]]--;
            if (!viz[b[j]])
                nr--;
        }

        rez+=i-j+1;

    }

    return rez;
}
void write(){
    printf("%lld", solve_subseq(U)-solve_subseq(L-1));
}