Cod sursa(job #634426)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 16 noiembrie 2011 12:01:40
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<utility>
#define M 666013
#define NMAX 1050000
using namespace std;
vector<pair<int,int> >H1[666014],H2[666013];
int a[NMAX],n,S=0,u,l,up,low;
void sterge1(int x)
{
   int k=-1,key=x%M;
   for(int i=0;i<H1[key].size();i++)
   {
      if(H1[key][i].first==x)
      {
         k=i;
         break;
      }
   }
   int i=H1[key].size();
   if(k!=-1 and H1[key][k].second==1) { swap(H1[key][k],H1[key][i-1]); H1[key].pop_back(); }   else
   if(k!=-1) H1[key][k].second--;
}
void sterge2(int x)
{
   int k=-1,key=x%M;
   for(int i=0;i<H2[key].size();i++)
   {
      if(H2[key][i].first==x)
      {
         k=i;
         break;
      }
   }   
   int i=H2[key].size();
   if(k!=-1 and H2[key][k].second==1) { swap(H2[key][k],H2[key][i-1]); H2[key].pop_back(); }   else
   if(k!=-1) H2[key][k].second--;
}
bool caut1(int x)
{
   int key=x%M;
   for(int i=0;i<H1[key].size();i++)
   if(H1[key][i].first==x)  return 0;
   return 1;
}
bool caut2(int x)
{
   int key=x%M;
   for(int i=0;i<H2[key].size();i++)
   if(H2[key][i].first==x)  return 0;
   return 1;
}
void add1(int x)
{
   int key=x%M,k=0;
   for(int i=0;i<H1[key].size();i++)
      if(H1[key][i].first==x) {
                                 H1[key][i].second++; 
                                 return; 
                              }
   H1[key].push_back(make_pair(x,1));
}
void add2(int x)
{
   int key=x%M,k=0;
   for(int i=0;i<H2[key].size();i++)
      if(H2[key][i].first==x) {
                                 H2[key][i].second++; 
                                 return; 
                              }
   H2[key].push_back(make_pair(x,1));
}
int main()
{
   int dist1=0,dist2=0,i,x;
   ifstream fi("secv5.in");
   ofstream fo("secv5.out");
   fi>>n>>l>>u;
   low=up=1;
   for(i=1;i<=n;i++)
   {
      fi>>x; a[i]=x;
      dist1=dist1+caut1(x);
      dist2=dist2+caut2(x);
      add1(x); add2(x);
      for( ;dist1>u;low++)
      {
         sterge1(a[low]);
         if(caut1(a[low])) dist1--;
      }
      for( ;dist2>l or a[up+1]==a[up];up++)
      {
         sterge2(a[up]);
         if(caut2(a[up])) dist2--;
      }
      if(l<=dist2) 
      S+=up-low+1;    
      
   }
   fo<<S<<"\n";
   return 0;
}