Cod sursa(job #106756)

Utilizator gigi_becaliGigi Becali gigi_becali Data 18 noiembrie 2007 22:27:54
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <string>
#include <ctime>
#define maxn 1024

int H[3*maxn][3*maxn];
int N=1000,SUM=0;

inline void update2(int i, int n, int l, int r, int p)
{
	++H[i][n];
	if(l>=r) return ;
	int m=(l+r)>>1;
	if(m>p) update2(i, n<<1, l, m, p);
	else    update2(i, (n<<1)|1, m+1, r, p);
}

inline void update(int n, int l, int r, int a, int b)
{
	update2(n, 1, 1, N, b);
	if(l>=r) return ;
	int m=(l+r)>>1;
	if(m>a) update(n<<1, l, m, a, b);
	else    update((n<<1)|1, m+1, r, a, b);
}

inline int query2(int i, int n, int l, int r, int a, int b)
{
	if(a<=l && r<=b) return H[i][n];
	int m=(l+r)>>1;
	int t=0;
	if(m>=a) t+=query2(i, n<<1, l, m, a, b);
	if(m<b) t+=query2(i, (n<<1)|1, m+1, r, a, b);
	return t;
}

inline void query(int n, int l, int r, int a, int b, int c, int d)
{
	if(a<=l && r<=b) 
	{
		SUM+=query2(n, 1, 1, N, c, d);
		return ;
	}
	int m=(l+r)>>1;
	if(m>=a) query(n<<1, l, m, a, b, c, d);
	if(m<b) query((n<<1)|1, m+1, r, a, b,c, d);
}


int main()
{
	srand(time(0));
	double s=clock();
	for(int i=1;i<=100000;++i) update(1, 1, N, rand()%1000, rand()%1000);
	
	printf("%lf\n", (clock()-s)/(double)CLOCKS_PER_SEC);
	
	
	return 0;
}