Cod sursa(job #2594388)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 5 aprilie 2020 21:00:21
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("secv5.in");
ofstream g("secv5.out");

#define N ((1 << 20) + 5)
int n,l,u,frecv[N],ind=0;
unsigned int v[N],aux[N],poz[N];
int z,fost,capat,nr;
long long sol=0;

int caut_bin(unsigned int x){
 int st=1,dr=ind,mid;
 while(st<=dr){
  mid=(st+dr)/2;
  if(poz[mid]<x) st=mid+1;
  else if(poz[mid]>x) dr=mid-1;
       else return mid;
 }
}

long long calc(int maxim){
 long long int rasp=0;
 for(int i=1;i<=ind;i++)
  frecv[i]=0;
 z=caut_bin(v[1]); frecv[z]++;
 nr=1; fost=z;
 for(int i=2;i<=n;i++){
  z=caut_bin(v[i]);
  if(frecv[z]==0&&nr==maxim){
   capat=i-1;
   break;
  }
  else{
   if(frecv[z]==0) nr++;
   frecv[z]++;
   if(i==n) capat=n;
  }
 }
 rasp+=capat;
 for(int i=2;i<=n;i++){
  frecv[fost]--;
  if(frecv[fost]==0) nr--;
  z=caut_bin(v[i]);
  fost=z;
  for(int j=capat+1;j<=n;j++){
    z=caut_bin(v[j]);
    if(frecv[z]==0&&nr==maxim){
     capat=j-1;
     break;
    }
    else{
     if(frecv[z]==0) nr++;
     frecv[z]++;
     if(j==n) capat=n;
    }
  }
  rasp+=capat-i+1;
 }
 return rasp;
}

int main()
{
f>>n>>l>>u;
for(int i=1;i<=n;i++){
 f>>v[i];
 aux[i]=v[i];
}
sort(aux+1,aux+n+1);
for(int i=1;i<=n;i++){
 if(aux[i]!=aux[i-1]){
  ind++;
  poz[ind]=aux[i];
 }
}
if(l>1)
 g<<calc(u)-calc(l-1);
else
 g<<calc(u);
}