Cod sursa(job #862053)

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

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

inline void add(unsigned int nr, unsigned int val) {
	unsigned int poz = nr % MOD;
	
	for(vector<pair<unsigned int, unsigned 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<unsigned int, unsigned int>(nr, val));
}

long long secv(unsigned int dim) {
    unsigned int i, st, dr;
    if(!dim)
        return 0;
     
    long long sol = 0;
    unsigned 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(unsigned int a, unsigned int b) {
    return x[a] < x[b];
}

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

int main() {
    unsigned int i;
     
     
       
    in >> n >> l >> u;
    //in.get();
      
    for(i = 1; i <= n; ++i) {
          
        in.getline(s, 1000);
         
        unsigned int pp = 0, r = 0;
        while(s[pp] >= '0' && s[pp] <= '9')
            r = r * 10 + s[pp++] - '0';
          
        x[i] = r;
    }
	
    out << secv(u) - secv(l-1)  << '\n';
      
    return 0;
}