Cod sursa(job #1713918)

Utilizator dani_mocanuDani Mocanu dani_mocanu Data 6 iunie 2016 22:08:01
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
const int P = 666013, nmax = (1 << 21);
int N,L,U;
unsigned int a[nmax];
vector < pair < unsigned int, int > > h[P+5];

void Add(unsigned int x, unsigned int &k)
{
    int r;
    unsigned int i;
    r = x % P;
    for( i = 0; i < h[r].size(); i++)
    {
        if(h[r][i].first == x)
        {
            h[r][i].second++;
            break;
        }
    }
    if(i == h[r].size())
    {
        k++;
        h[r].push_back(make_pair(x,1));
    }
}

void Delete(unsigned int x, unsigned int &k)
{
    int r;
    r = x % P;
    for(unsigned i = 0; i < h[r].size(); i++)
    {
        if(h[r][i].first == x)
        {
            h[r][i].second--;
            if(h[r][i].second == 0)
            {
                k--;
                swap(h[r][i],h[r][h[r].size()-1]);
                h[r].pop_back();
            }
            break;
        }
    }
}

long long Solve(int M)
{
    unsigned int i,j,k;
    long long sol = 0;
    for(i = 1; i <= P; i++) h[i].clear();
    j = 1;
    k = 0;
    for(i = 1; i <= N; i++)
    {
        Add(a[i],k);
        while(k > M)
        {
            Delete(a[j],k);
            j++;
        }
        sol = sol + (i-j+1);
    }
    return sol;
}


int main()
{
    fin>>N>>L>>U;
    for(int i = 1; i <= N; i++) fin>>a[i];
    fout << Solve(U) - Solve(L-1) << "\n";
    fout.close();
    return 0;
}