Pagini recente » Cod sursa (job #1873146) | Cod sursa (job #2330617) | Cod sursa (job #1769158) | Istoria paginii runda/oji_simulare_2020_cl10/clasament | Cod sursa (job #862053)
Cod sursa(job #862053)
#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;
}