Cod sursa(job #716130)

Utilizator BoSs_De_BosSSeFu SeFiLoR BoSs_De_BosS Data 18 martie 2012 12:49:25
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<string>
#define M 666013
#define DIM (1 << 20) + 1
using namespace std;

unsigned int n,l,u,norm,a[DIM],st,dr;
vector<vector<unsigned int> > G;
vector<pair<unsigned int, unsigned int> > b;

vector<short int> f;

ifstream in("secv5.in");
ofstream out("secv5.out");

unsigned long long secv(unsigned int dim) {
	
	f.clear();
	f.resize(norm+1, 0);
	
    if (!dim) return 0;
	
    unsigned long long sol=0, nr=0;
	
    G.clear(); G.resize(M);
	
    for(st = 1, dr = 1; dr <= n; ++dr) {
		
		if(!f[a[dr]])
			nr++;
        
		f[a[dr]]++;
		
        while(nr > dim) {
			
            if (!(--f[a[st]])) 
				nr--;
            st++;
        }
        sol += dr - st + 1;
    }
    return sol;
}

int main() {
	unsigned int x,i,j;
	char s[30];
	
    in >> n >> l >> u;
	in.get();
	
    for(i = 1; i <= n; ++i) {
		
        in.getline(s,30);
		x = 0;
		for(j = 0; s[j]!=0; ++j)
			x = x * 10 + s[j] - '0';
		
        b.push_back(make_pair(x, i));
    }
    
    sort(b.begin(), b.end());
	
    for(i = 0; i < b.size(); ++i)
        if (!i || b[i].first != b[i-1].first) 
                a[b[i].second] = ++norm;
        else 
                a[b[i].second] = norm;
    
    out << secv(u) - secv(l-1)  << '\n';
	
    return 0;
}