Cod sursa(job #2612327)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 8 mai 2020 20:59:18
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 1050000;
unsigned int n, L, U;

FILE *fin = fopen("secv5.in", "r");
int cursor = 0;
const int DIM = (1<<21);
char buf[DIM];

void adv()
{
    if (__builtin_expect(++cursor == DIM, 0)) {
        cursor = 0;
        fread(buf, DIM, 1, fin);
    }
}

void readUnsigned(unsigned int &nr)
{
    for (; buf[cursor] < '0'; adv());
    for (nr = 0; buf[cursor] >= '0' && buf[cursor] <= '9'; adv())
        nr = nr*10 + buf[cursor] - '0';
}

struct Elem
{
    unsigned int val;
    int pos;
};
Elem elements[MAXN];
unsigned int norm[MAXN];
unsigned int m[MAXN];

bool cmp(Elem e, Elem f)
{
    return e.val < f.val;
}

long long compute(unsigned int x)
{
    for (unsigned int i = 0; i < n; i++) m[i] = 0;
    unsigned int st = 0;
    long long sol = 0;
    unsigned int msize = 0;
    for (unsigned int dr = 0; dr < n; dr++) {
        if (m[norm[dr]] == 0)
            msize++;
        ++m[norm[dr]];
        while (msize > x) {
            m[norm[st]]--;
            if (m[norm[st]] == 0)
                msize--;
            ++st;
        }
        sol += dr - st +1;
    }
    return sol;
}

int main()
{
    ofstream fout("secv5.out");
    fread(buf, DIM, 1, fin);

    readUnsigned(n);
    readUnsigned(L);
    readUnsigned(U);
    for (unsigned int i = 0; i < n; i++) {
        readUnsigned(elements[i].val);
        elements[i].pos = i;
    }
    sort(elements, elements+n, cmp);

    for (unsigned int i = 1; i < n; i++)
        norm[elements[i].pos] = norm[elements[i-1].pos] + (elements[i].val != elements[i-1].val);

    long long rez = compute(U) - compute(L-1);
    fout << rez;

    return 0;
}