Cod sursa(job #1760721)

Utilizator nnnmmmcioltan alex nnnmmm Data 21 septembrie 2016 10:00:14
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<cstdio>
#include<vector>
const unsigned int MAXN=1<<21,MOD1=117802,MOD2=28491;
unsigned int v[MAXN];
std::vector<std::pair<unsigned int,unsigned int> > map[MOD1];

unsigned int Get_Pos(unsigned int x)
{
 unsigned int r1=x%MOD1,r2=x%MOD2;
 for(unsigned int pos=0;pos<map[r1].size();pos++)
     {
      if(map[r1][pos].first==r2)
         return pos;
     }
 return -1;
}

unsigned int Get_Val(unsigned int x)
{
 unsigned int pos=Get_Pos(x);
 unsigned int r1=x%MOD1,r2=x%MOD2;
 if(pos==-1 || map[r1][pos].second==0)
    return -1;
 else
    return map[r1][pos].second;
}

bool Add(unsigned int x)
{
 unsigned int pos=Get_Pos(x);
 unsigned int r1=x%MOD1,r2=x%MOD2;
 if(pos==-1)
    {
     map[r1].push_back(std::make_pair(r2,1));
     return true;
    }
 else
    {
     map[r1][pos].second++;
     return (map[r1][pos].second==1);
    }
}

bool Decrease(unsigned int x)
{
 unsigned int pos=Get_Pos(x);
 unsigned int r1=x%MOD1,r2=x%MOD2;
 if(pos==-1 || map[r1][pos].second==0)
    return false;
 else
    map[r1][pos].second--;
 return (map[r1][pos].second==0);
}

unsigned int n,l,u;

long long Numara(unsigned int val)
{
 unsigned int st=1,dr,dif=0;
 long long rasp=0ll;
 for(dr=1;dr<=n;dr++)
     {
      dif+=Add(v[dr]);
      while(dif>val)
            {
             dif-=Decrease(v[st]);
             st++;
            }
      rasp=rasp+dr-st+1;
     }
 for(int i=1;i<=n;i++)
     Decrease(v[i]);
 return rasp;
}

int main()
{
 FILE *file=fopen("secv5.in","r");
 fscanf(file,"%d %d %d",&n,&l,&u);
 for(unsigned int i=1;i<=n;i++)
     {
      fscanf(file,"%d ",&v[i]);
     }
 fclose(file);
 file=fopen("secv5.out","w");
 fprintf(file,"%lld ",Numara(u)-Numara(l-1));
 fclose(file);
 return 0;
}