Cod sursa(job #368404)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 24 noiembrie 2009 20:39:26
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
# include <stdio.h>

int a[20000],is[40000],id[40000],st[40000],dr[40000],p,u,n,mij,s[40000],x,y,sumf,i,l,k,q;

void crearearb ()
{
is[1]=1;
id[1]=n;
p=1;
u=1;

  while (p<=u)
   {
    if (is[p]<id[p])
    {
    mij=(is[p]+id[p])/2;
    u++;

    st[p]=u;
    is[u]=is[p];
    id[u]=mij;

    u++;

    dr[p]=u;
    is[u]=mij+1;
    id[u]=id[p];

    }
     if (is[p]==id[p])
     s[p]=a[is[p]];


     p++;

      }

      }


      void sum (int nod)
      {

	  if (st[nod]!=0 || dr[nod]!=0)
	  {
	  sum (st[nod]);
	  sum (dr[nod]);
	  }
	  if (s[nod]==0)
	  s[nod]=s[st[nod]]+s[dr[nod]];




      }


 void inter (int nod)

  {
   int mij;

   if (is[nod]>=x && id[nod]<=y)
   {


   sumf=s[nod]+sumf;
   }
   else
   {
   mij=(is[nod]+id[nod])/2;
   if (x<=mij)
   inter (st[nod]);

   if (y>mij)
   inter (dr[nod]);

   }


   }

    void schimba (int nod)

    {
   int  mij=(is[nod]+id[nod])/2;
   if (is[nod]==x && id[nod]==x)
   {
   s[nod]=s[nod]-y;
   a[x]=a[x]-y;
   }
   else
   {
   if (x<=mij)
   schimba (st[nod]);
   else
   schimba (dr[nod]);

   s[nod]=s[st[nod]]+s[dr[nod]];

   }

   }








int main ()
{
freopen ("datorii.in","r",stdin);
freopen ("datorii.out","w",stdout);
scanf ("%i%i",&n,&k);

 for (i=1;i<=n;i++)
  scanf ("%i",&a[i]);


  crearearb ();
  sum (1);

  for (i=1;i<=k;i++)
  {
  scanf ("%i%i%i",&l,&x,&y);

  if (l==1)
  {
  sumf=0;

  if (x==y)
  sumf=a[x];

  else
  inter (1);

  printf ("%i\n",sumf);
  }
  else

  schimba (1);

  }




  return 0;
  }