Cod sursa(job #858178)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 18 ianuarie 2013 17:26:25
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
 
const int N = 1000100;
const int MOD = 666013;
 
int n, l, u, no, norm[N], x[N];
char s[30];
vector<pair<int, int> > h[MOD];

inline bool find(int el) {
	int poz = el % MOD;
	
	for(vector<pair<int, int> >::iterator it = h[poz].begin(); it != h[poz].end(); ++it)
		if(it->first == el && it->second)
			return true;
	return false;
}

inline void add(int nr, int val) {
	int poz = nr % MOD;
	
	for(vector<pair<int, int> >::iterator it = h[poz].begin(); it != h[poz].end(); ++it)
		if(it->first == nr) {
			it->second += val;
			return;
		}
	h[poz].push_back(make_pair<int, int>(nr, val));
}

long long secv(int dim) {
    int i, st, dr;
    if(!dim)
        return 0;
     
    long long sol = 0;
    int nu = 0;
	
    for(i = 0; i < MOD; ++i)
		h[i].clear();
	
    for(st = 1, dr = 1; dr <= n; ++dr) {
          
        if(!find(x[dr]))
            nu++;
        add(x[dr], 1);
          
        while(nu > dim) {
             
            add(x[st], -1);
             
            if(!find(x[st])) 
                nu--;
             
            st++;
        }
        sol += dr - st + 1;
    }
     
    return sol;
}
 
bool cmp(int a, int b) {
    return x[a] < x[b];
}
 
int main() {
    int i;
     
     
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);
     
    cin >> n >> l >> u;
    cin.get();
      
    for(i = 1; i <= n; ++i) {
          
        gets(s);
         
        int pp = 0, r = 0;
        while(s[pp] >= '0' && s[pp] <= '9')
            r = r * 10 + s[pp++] - '0';
          
        x[i] = r;
    }
	
    cout << secv(u) - secv(l-1)  << '\n';
      
    return 0;
}