Cod sursa(job #178323)

Utilizator alecmanAchim Ioan Alexandru alecman Data 14 aprilie 2008 13:39:36
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include<stdio.h>

#define INPUT "datorii.in"
#define OUTPUT "datorii.out"
#define NMAX 15001

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

long N, M, X, Y, Sum, code, taskCode;
long A[ NMAX ], Tree[ 5 * NMAX ];

void UpdateTree(long node, long left, long right)
{
  long middle;

  if(left == right)
  {
    if(taskCode == 2)
      Tree[ node ] -= Y;
    else
      Tree[ node ] = Y;

    return;
  }
  
  middle = (left + right) >> 1;

  if(X <= middle)
    UpdateTree(2 * node, left, middle);
  else
    UpdateTree(2 * node + 1, middle + 1, right);

  Tree[ node ] = Tree[ 2 * node ] + Tree[ 2 * node + 1 ];
}

void QueryTree(long node, long left, long right)
{
  long middle;

  if(X <= left && right <= Y)
  {
    Sum += Tree[ node ];
    return;
  }

  middle = (left + right) >> 1;

  if(X <= middle)
    QueryTree(2 * node, left, middle);
  if(Y > middle)
    QueryTree(2 * node + 1, middle + 1, right);
}

void readValues()
{
  fscanf(fin, "%ld %ld", &N, &M);

  for(long i = 1; i <= N; ++i)
  {
    fscanf(fin, "%ld", &A[ i ]);
    X = i;
    Y = A[ i ];
    UpdateTree(1, 1, N);
  }
}

void readNew()
{
  fscanf(fin, "%ld %ld %ld", &code, &X, &Y);
}

int main()
{
  taskCode = 1;

  readValues();

  for(long i = 0; i < M; ++i)
  {
    taskCode = 2;

    readNew();

    if(!code)
      UpdateTree(1, 1, N);
    else
    {
      Sum = 0;

      QueryTree(1, 1, N);

      fprintf(fout, "%ld\n", Sum);
    }
  }

  fclose(fin);
  fclose(fout);

  return 0;
}