Cod sursa(job #1047919)

Utilizator jul123Iulia Duta jul123 Data 4 decembrie 2013 23:38:14
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<iostream>
#include<cstdio>
#include<vector>
#define MOD 666031;
using namespace std;

vector<pair<int, int> >h[666032];
int v[1048577], n;
int number(int u)
{

    int nr=0, numar=0, i, st, dr, zona, j, x, ok;
    for(i=0; i<=666031; i++)
        h[i].clear();
    st=1; dr=0;
    for(i=1; i<=n; i++)
        {
            dr++;
            x=v[i];
            zona=x%MOD;
            ok=0;
            for(j=0; j<h[zona].size(); j++)
                if(h[zona][j].first==v[i])
                    {ok=1;h[zona][j].second++;}
            if(ok==0)
                {
                    h[zona].push_back(make_pair(v[i], 1));
                    nr++;
                }

            if(nr<=u)
                numar+=(dr-st+1);
            else
                {
                    while(nr>u)
                    {st++;
                    zona=v[st-1]%MOD;
                    for(vector<pair<int, int> >::iterator it=h[zona].begin(); it!=h[zona].end(); it++)
                        {if((*it).first==v[st-1])
                            {if((*it).second==1)
                               {
                                nr--;
                                h[zona].erase(it);
                                break;
                               }
                               else
                                (*it).second--;
                    }
                    }
                    }
                    numar+=(dr-st+1);
                }
}
return numar;
}
int main()
{
    FILE *fin, *fout;
    fin=fopen("secv5.in","r");
    fout=fopen("secv5.out", "w");

    int i, l, c, a, b;
    fscanf(fin, "%d %d %d",&n, &l, &c);
    for(i=1; i<=n; i++)
        fscanf(fin, "%d", &v[i]);
    fprintf(fout, "%d", number(c)-number(l-1));


}