Cod sursa(job #1418950)

Utilizator figure0907Andrei Gonczi figure0907 Data 14 aprilie 2015 14:30:00
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
#include <stdio.h>

#define MAX 32768

int suma[MAX];

void update(int nod, int left, int right, int val, int pos, int operatie) {

  if (left == right) {
    suma[nod] += (val * operatie);
    return;
  }

  int mid = (left + right) / 2;
  if (mid >= pos) {
    update(2 * nod, left, mid, val, pos, operatie);
  }
  else {
    update(2 * nod + 1, mid + 1, right, val, pos, operatie);
  }

  suma[nod] = suma[2 * nod] + suma[2 * nod + 1];
}

int query(int nod, int left, int right, const int start, const int stop) {

  if (left >= start && right <= stop) {
    return suma[nod];
  }

  int a = 0, b = 0;
  int mid = (left + right) / 2;

  if (start <= mid) {
    a = query(2 * nod, left, mid, start, stop);
  }
  if (mid < stop) {
    b = query(2 * nod + 1, mid + 1, right, start, stop);
  }

  return a + b;

}

int main() {

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

  int n, m;
  fscanf(in, "%d %d", &n, &m);

  int i, nr;
  for (i = 1; i <= n; i++) {
    fscanf(in, "%d", &nr);
    update(1, 1, n, nr, i, 1);
  }

  int a, b, operatie;
  for (i = 1; i <= m; i++) {
    fscanf(in, "%d", &operatie);
    switch (operatie) {
    case 0:
      fscanf(in, "%d %d", &a, &b);
      update(1, 1, n, b, a, -1);
      break;
    case 1:
      fscanf(in, "%d %d", &a, &b);
      fprintf(out, "%d\n", query(1, 1, n, a, b));
      break;
    }
  }

  fclose(in);
  fclose(out);

  return 0;
}
/*#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define maxn 35001
#define maxm 100001

struct trip
{
    int t;
    int x, y;
};

int n,m,i,p;
int a[maxn];
int v[2*maxn];
trip q[maxn];

void readdata()
{
    FILE *f = fopen("datorii.in","rt");
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%d",&a[i]);
    }
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&q[i].t,&q[i].x,&q[i].y);
    }
    fclose(f);
}

int build_bin(int i)
{
    if (i>=p)
    {
        v[i]=a[i-p+1];
        return v[i];
    }
    v[i]=build_bin(2*i)+build_bin(2*i+1);
    return v[i];
}

int get_val(int x, int y)
{
    long long st=0, dr=0;
    int next;

    while (x>1)
    {
        next=x/2;
        if ((x%2)==1)
        {
            st+=v[x-1];
        }
        x=next;
    }

    while (y>1)
    {
        next=y/2;
        if ((y%2)==0)
        {
            dr+=v[y+1];
        }
        y=next;
    }

    return v[1]-st-dr;
}

void mod_val(int x, int y)
{
    while (x>0)
    {
        v[x]-=y;
        x/=2;
    }
}

void solve()
{
    p=1;
    while (p<n) p*=2;
    build_bin(1);
}

void writedata()
{
    FILE *f = fopen("datorii.out","wt");
    for (i=1;i<=m;i++)
    {
        if (q[i].t)
        {
            fprintf(f,"%d\n",get_val(q[i].x+p-1,q[i].y+p-1));
        }
        else
        {
            mod_val(q[i].x+p-1,q[i].y);
        }
    }
    fprintf(f,"\n");
    fclose(f);
}

int main()
{
    readdata();
    solve();
    writedata();

    return 0;
}
*/