Cod sursa(job #265571)

Utilizator vlad_DVlad Dumitriu vlad_D Data 24 februarie 2009 03:22:56
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

typedef unsigned int I;

int n;
struct nod {
       I val;
       int id;
       nod* nextP;
       };
typedef nod* nodP;

int idx = 0;
nodP Hash[1000000];

const int M = 999983;
int v[1 << 20];
int diva[(1<<20)+1];

int A, B, N;
int findIdx(I X) {
    int key = X % M;
    
    nodP index = Hash[key];
    while (index != NULL) {
          if (index->val == X) return index->id;
          index = index->nextP;
          }
   return -1;
    }
void addHash(I X) {
     int key = X % M;
     
     nodP bb = new nod;
     bb->val = X; bb->id = idx;
     bb->nextP = Hash[key];
     Hash[key] = bb;          
     ++idx;
     }
typedef long long LL;
LL findA(I A) {
             //sub lungime A
             if (A == 0) return 0;
             int distincte = 0;
             int left = 0;
             LL total = 0;
             for (int i = 0; i < N; ++i) {
                 if (!diva[v[i]]) {++distincte;}
                 ++diva[v[i]];
                 //adjust left
                 while (left < i && distincte > A) {
                       if (--diva[v[left++]] == 0) --distincte;
      
                       }
                 total+= i - left + 1;                
                 }
             while (left < N) {--diva[v[left++]];}
             return total;
             }
int main() {
    ifstream fin("secv5.in");    
    ofstream fout("secv5.out");
    fin >> N >> A >> B;
    for (int i = 0; i < N; ++i) {
        I X;
        fin >> X;
        v[i] = findIdx(X);
        if (v[i] == -1) { v[i] = idx; addHash(X); }        
        }
    fout << findA(B) - findA(A-1) << '\n';        
    return 0;
    }