Pagini recente » Cod sursa (job #3301599) | Monitorul de evaluare | Cod sursa (job #154362) | Cod sursa (job #38787) | Cod sursa (job #3349484)
#include <fstream>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <set>
#include <deque>
std::ifstream fin("secv5.in");
std::ofstream fout("secv5.out");
std::unordered_map<int, int> oldest, newest;
std::vector<int> v;
std::vector<int> dp; //dp[i] = nr de secvente cu proprietatea din enunt terminate in pozitia i
std::deque<int> dq;
int n, l, u;
long long counter;
int main(){
fin >> n >> l >> u;
v.resize(n);
dp.resize(n);
for(int i = 0; i < n; ++i){
fin >> v[i];
if(oldest.find(v[i]) != oldest.end()){
newest[v[i]] = i;
if((int)oldest.size() >= l){
int t = (int)oldest.size() - l;
dp[i] = newest[dq[t]] - oldest[dq[0]] + 1;
}
}
else{
if((int)oldest.size() < u){
oldest[v[i]] = newest[v[i]] = i;
dq.push_back(v[i]);
if((int)oldest.size() >= l){
int t = (int)oldest.size() - l;
dp[i] = newest[dq[t]] - oldest[dq[0]] + 1;
}
}
else{
int t = dq.front();
dq.pop_front();
oldest.erase(oldest.find(t));
newest.erase(newest.find(t));
oldest[v[i]] = newest[v[i]] = i;
dq.push_back(v[i]);
t = (int)oldest.size() - l;
dp[i] = newest[dq[t]] - oldest[dq[0]] + 1;
}
}
}
for(int i = 0; i < n; ++i){
counter += (long long)dp[i];
}
fout << counter;
}