Cod sursa(job #254596)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 7 februarie 2009 13:09:31
Problema Cuburi2 Scor 20
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 2 Marime 1.79 kb
#include <cstdio>

int arb[400050], N, M, val, poz, maxim, s, f, fr[400050], pp, v[250005];

int max(int x, int y) {return x > y ? x : y;}

void update(int nod, int st, int dr)
{
   if (st == dr)
   {
      arb[nod] = val;
	  fr[nod] = st;
      return;
   }

   int mij = (st + dr) / 2;
   if (poz <= mij) update(2 * nod, st, mij);
   else update(2 * nod + 1, mij + 1, dr);

   arb[nod] = max(arb[2*nod], arb[2*nod+1]);
   if (arb[nod] == arb[2 * nod]) fr[nod] = fr[2 * nod];
   else fr[nod] = fr[2 * nod + 1];
}

void query(int nod, int st, int dr)
{
   if (s <= st && dr <= f)
   {
      if (maxim < arb[nod])
	  {
		  maxim = arb[nod];
		  pp = fr[nod];
	  }
	  
      return;
   }
   int mij = (st + dr) / 2;
   if (s <= mij) query(2 * nod, st, mij);
   if (mij < f) query(2 * nod + 1, mij + 1, dr);
}


int ab(int x) { return x > 0 ? x : (-x);}

void citire()
{
   freopen("cuburi2.in","r",stdin);
   freopen("cuburi2.out","w",stdout);

   int i;
   scanf("%d %d",&N, &M);
   for (i = 1; i <= N; i++)
   {
      scanf("%d",&v[i]);
      poz = i;
      val = v[i];
      update(1,1,N);
   }
}

void arbori()
{
	int i, j, a, b, nr;
	for (i = 1; i <= M; i++)
	{
		scanf("%d %d",&a,&b);
		maxim = -1;  
		s = a; f = b;  
		query(1,1,N);

		nr = 0;
		for (j = a; j <= b; j++) nr += (v[j] * ab(pp - j));
		printf("%d %d\n",pp, nr);
	}
}

void brut()
{
	int i, j, nr, minim, a, b, k;
	for (i = 1; i <= M; i++)
	{
		scanf("%d %d",&a,&b);
		minim = (1<<30);
		for (j = a; j <= b; j++)
		{
			nr = 0;
			for (k = a; k <= b; k++) nr += (v[k] * ab(j - k));
			if (nr < minim)
			{
				minim = nr; 
				pp = j;
			}
		}
		printf("%d %d\n",pp,minim);
	}
}

int main()
{
	citire();
	if (N > 5000) arbori();
	else brut();
	return 0;
}