Pagini recente » Cod sursa (job #2465071) | Cod sursa (job #540844) | Cod sursa (job #1256016) | Cod sursa (job #1645451) | Cod sursa (job #1775033)
#include <iostream>
#include <fstream>
#include <vector>
#define MOD 666013
#define db 0
#define DB 0
#define NMAX (1<<20) + 3
using namespace std;
class InputReader {
public:
InputReader() {}
InputReader(const char *file_name) {
input_file = fopen(file_name, "r");
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
inline InputReader &operator >>(unsigned int &n) {
while(buffer[cursor] < '0' || buffer[cursor] > '9') {
advance();
}
n = 0;
while('0' <= buffer[cursor] && buffer[cursor] <= '9') {
n = n * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE *input_file;
static const int SIZE = 1 << 17;
int cursor;
char buffer[SIZE];
inline void advance() {
++ cursor;
if(cursor == SIZE) {
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
}
} c ("secv5.in");
unsigned int l, u, n, v[NMAX];
vector <unsigned int> h[MOD + 1], count[MOD + 1];
void add (unsigned int x, unsigned int val)
{
if (db)
{
cout << "am adaugat " << x << endl;
}
unsigned int r = x % MOD;
for (unsigned int i = 0; i < h[r].size(); i++)
{
if (h[r][i] == x)
{
count[r][i] += val;
return;
}
}
h[r].push_back(x);
count[r].push_back(1);
}
unsigned int f (unsigned int x)
{
unsigned int r = x % MOD;
for (unsigned int i = 0; i < h[r].size(); i++)
{
if (h[r][i] == x)
return count[r][i];
}
return 0;
}
long long solve (unsigned int k)
{
if (db)
cout << "here" << endl;
unsigned int inter = 0, i1 = 1;
long long sol = 0;
for (unsigned int i = 1; i <= n; i++)
{
if (f(v[i]) == 0)
inter++;
if (DB)
cout << inter << " "<< v[i] <<endl;
add (v[i], 1);
while (inter > k)
{
if(db == 1)
cout << "here" << endl;
add (v[i1], -1);
if (f(v[i1]) == 0)
inter--;
i1++;
}
if (db)
cout << "WTF" << endl;
sol += (long long)(i - i1 + 1);
}
for (unsigned int i = 0; i <= MOD; i++)
{
h[i].clear();
count[i].clear();
}
return sol;
}
int main()
{
// ifstream cin ("secv5.in");
ofstream cout ("secv5.out");
c >> n >> l >> u;
for (unsigned int i = 1; i <= n; i++)
c >> v[i];
cout << solve(u) - solve(l - 1);
return 0;
}