Cod sursa(job #1964912)

Utilizator TimoteiCopaciu Timotei Timotei Data 13 aprilie 2017 19:50:06
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <iostream>
#include <fstream>
#include <vector>
#define el first
#define ap second
#define mod 11311
#define FOR(i, x, y) for(int i = x; i <= y; ++i)
#define FORR(i, x, y) for(int i = x; i >= y; --i)
#define pb(x) push_back(x)
#define nMax (1 << 20) + 5

using namespace std;
vector < pair<unsigned int, unsigned int> > v[2][mod + 4];
unsigned int a[nMax], n, l, u;
int Find(int x, int type)
{
    if(v[type][x % mod].size() != 0)
        FOR(i, 0, v[type][x % mod].size() - 1)
          if(v[type][x % mod][i].el == x) return 1;
    return 0;
}
void Insert(int x, int type)
{
    if(v[type][x % mod].size() != 0)
        FOR(i, 0, v[type][x % mod].size() - 1)
          if(v[type][x % mod][i].el == x) {
            v[type][x % mod][i].ap++;
            return;
          }
    v[type][x % mod].pb(make_pair(x, 1));
}
void Delete(int x, int type)
{
    int p = -1;
    if(v[type][x % mod].size() != 0)
        FOR(i, 0, v[type][x % mod].size() - 1)
          if(v[type][x % mod][i].el == x) {
            if(v[type][x % mod][i].ap > 1){
                v[type][x % mod][i].ap--;
                return;
            }
            p = i;
            break;
          }
    if(p != -1) v[type][x % mod].erase(v[type][x % mod].begin() + p);
}
int main()
{
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    fin >> n >> l >> u;
    FOR(i, 1, n)
      fin >> a[i];
    unsigned int index = 1, dr = 0, Dr = 0, dif = 0, Dif = 0;
    unsigned long long sol = 0;
    while(1){
       dr++;
       Dr++;
       while(dr <= n && dif < l){
         if(!Find(a[dr], 0)) ++dif;
         Insert(a[dr], 0);
         dr++;
       }
       dr--;
       while(Dr <= n){
         if(!Find(a[Dr], 1)){
            if(Dif + 1 > u) break;
            ++Dif;
         }
         Insert(a[Dr], 1);
         Dr++;
       }
       Dr--;
       if(dif < l) break;
       sol += Dr - dr + 1;
       Delete(a[index], 0);
       if(!Find(a[index], 0)) dif--;
       Delete(a[index], 1);
       if(!Find(a[index], 1)) Dif--;
       ++index;
       if(dr == n) break;
    }
    fout << sol;
    return 0;
}