Cod sursa(job #120465)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 5 ianuarie 2008 15:39:58
Problema Secventa 5 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <string>

using namespace std;

#define maxn 1048576
#define nr 666013
#define mod 131072
#define maxl 13
#define maxk 4
#define ll long long
#define ui unsigned int
#define uc unsigned char

int n,x,y;
ll sol;
ui a[maxn];
char r[maxl];
ui h[maxk][mod];
uc c[maxk][mod];
char v[mod];

inline char add(ui x)
{
	ui y = ((ui) x * nr) >> 15;
	int i;

	for (i=0;i<v[y];++i)
		if (h[i][y] == x) 
		{
			c[i][y]++;
			return 0;
		}

	h[v[y]][y] = x;
	c[v[y]][y] = 1;
	v[y]++;

	return 1;
}

inline char erase(ui x)
{
	ui y = ((ui) x * nr) >> 15;

	int i;
	for (i=0;i<v[y];++i)
		if (h[i][y] == x)	
			if (c[i][y]>1) 
			{
				c[i][y]--;
				return 0;
			}
			else {
					 v[y]--;
				     h[i][y] = h[v[y]][y];
					 c[i][y] = h[v[y]][y];
					 return 1;
				 }	

	return 1;
}

inline ll solve(int x)
{
	ll rez=0;
	int i,j=0,diff=0;

	for (i=0;i<n;++i)
	{
		diff += add(a[i]);
		while (j<=i && diff>x) 
		{
			diff -= erase(a[j]);
			++j;
		}

		rez += i-j+1;
	}
	
	return rez;
}

int main()
{
	freopen("secv5.in","r",stdin);
	freopen("secv5.out","w",stdout);

	scanf("%d %d %d ",&n,&x,&y);

	int i,j;

	for (i=0;i<n;++i)
	{
		fgets(r,maxl,stdin);

		for (j=0;r[j]!='\n';++j) a[i] = a[i] * 10 + r[j] - '0';
	}

	sol = solve(y);

	memset(h,0,sizeof(h));
	memset(c,0,sizeof(c));
	memset(v,0,sizeof(v));

	sol -= solve(x-1);

	printf("%lld\n",sol);

	return 0;
}