Cod sursa(job #858075)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 18 ianuarie 2013 14:59:15
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda ichb-locala-2013-10 Marime 1.36 kb
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;

const int N = 1000100;

int n, l, u, no, norm[N], x[N], p[N], nr[N];
char s[30];

long long secv(int dim) {
    int i, st, dr;
	if(!dim)
		return 0;
	
    long long sol = 0;
	int nu = 0;
	
	for(i = 1; i<=n; ++i)
		nr[i] = 0;
	
    for(st = 1, dr = 1; dr <= n; ++dr) {
         
        if(!nr[norm[dr]])
            nu++;
        nr[norm[dr]]++;
         
        while(nu > dim) {
            
			--nr[norm[st]];
			
            if(!nr[norm[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;
		p[i] = i;
    }
	
    sort(p + 1, p + n + 1, cmp);
    
    for(i = 1; i <= n; ++i)
        if (i == 1 || x[p[i]] != x[p[i - 1]]) 
			norm[p[i]] = ++no;
        else
            norm[p[i]] = no;
     
    cout << secv(u) - secv(l-1)  << '\n';
     
    return 0;
}