Cod sursa(job #1567120)

Utilizator fhandreiAndrei Hareza fhandrei Data 12 ianuarie 2016 22:13:04
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
using namespace std;

#define trace(x) cerr << #x << ": " << x << '\n'
#define trace2(x, y) cerr << #x << ": " << x << " " << #y << ": " << y << '\n'

int solve(vector<unsigned> values, int limit)
{
    int answer = 0;

    map<unsigned int, int> myHash;

    for(size_t left=1, right=1 ; right<values.size() ; ++right)
    {
        // trace2(left, right);
        ++myHash[values[right]];
        // trace(myHash.size());
        while(myHash.size() > static_cast<size_t>(limit))
        {
            if(--myHash[values[left]] == 0)
                myHash.erase(values[left]);

            ++left;
        }
        answer += right-left;
    }

    // trace(answer);

    return answer;
}

int main()
{
    ifstream in("secv5.in");
    ofstream out("secv5.out");

    int num, left, right;
    in >> num >> left >> right;
    vector<unsigned int> values(num+1);

    for(int i=1 ; i<=num ; ++i)
        in >> values[i];

    out << solve(values, right) - solve(values, left-1) << '\n';

    in.close();
    out.close();
    return 0;
}