Cod sursa(job #1252695)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 31 octombrie 2014 00:38:42
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>

#define NMAX 15000
int ArbInt[4 * NMAX];
int v[NMAX];
int n, m;

int build (int nod, int st, int dr)
{
  if (dr - st < 1)
    {
      ArbInt[nod] = v[st];
      return v[st];
    }

  int mid = (st + dr) >> 1;

  int vl = build (nod * 2 + 1, st, mid);
  int vr = build (nod * 2 + 2, mid + 1, dr);

  ArbInt[nod] = vl + vr;
  return ArbInt[nod];
}

int inclus (int x1, int y1, int x2, int y2)
{
  return x2 <= y1 && x1 >= x2 && y2 >= y1;
}

int intersect (int x1, int y1, int x2, int y2)
{
  return x1 <= y2 && x2 <= y1;
}

int update (int nod, int st, int dr, int a, int b, int val)
{
  if (inclus (st, dr, a, b))
    {
      ArbInt[nod] += val;
      return val;
    }

  int mid = (st + dr) >> 1;
  if (intersect (st, mid, a, b))
    update (nod * 2 + 1, st, mid, a, b, val);
  if (intersect (mid + 1, dr, a, b))
    update (nod * 2 + 2, mid + 1, dr, a, b, val);

  ArbInt[nod] = ArbInt[nod * 2 + 1] + ArbInt[nod * 2 + 2];
  return ArbInt[nod];
}

int query (int nod, int st, int dr, int a, int b)
{
  if (inclus (st, dr, a, b))
    return ArbInt[nod];

  int mid = (st + dr) >> 1;

  int p1 = 0, p2 = 0;
  if (intersect (st, mid, a, b))
    p1 = query (nod * 2 + 1, st, mid, a, b);
  if (intersect (mid + 1, dr, a, b))
    p2 = query (nod * 2 + 2, mid + 1, dr, a, b);

  return p1 + p2;
}

int main()
{
  FILE *in = fopen ("datorii.in", "r");
  FILE *out = fopen ("datorii.out", "w");

  fscanf (in, "%d%d", &n, &m);
  
  int i;
  for (i = 0; i < n; ++i)
    fscanf (in, "%d", &v[i]);

  build (0, 0, n - 1);

  for (i = 0; i < m; ++i)
    {
      int t, x, y;
      fscanf (in, "%d%d%d", &t, &x, &y);

      if (t == 0)
	update (0, 0, n - 1, x - 1, x - 1, -y);
      if (t == 1)
	fprintf(out, "%d\n", query (0, 0, n - 1, x - 1, y - 1));
    }

  fclose (in);
  fclose (out);
  
  return 0;
}