Cod sursa(job #2816646)

Utilizator albertaizicAizic Albert albertaizic Data 11 decembrie 2021 20:15:02
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#define MAX 100000

int v[MAX];
int aint[4 * MAX];
int lLim, rLim;

void build(int l, int r, int loc){
  int lSon, rSon, mid;

  if(l==r){
    aint[loc]=v[l];
    return;
  }

  mid=(l+r)/2;
  lSon=loc+1;
  rSon=loc+2*(mid-l+1);

  build(l, mid, lSon);
  build(mid + 1, r, rSon);
  aint[loc]=aint[lSon]+aint[rSon];
}

int calcm(int l, int r, int loc) {
  int lsum, rsum, lSon, rSon, mid;

  if( lLim<=l && r<=rLim){
    return aint[loc];
  }

  mid=(l+r)/2;
  lSon=loc+1;
  rSon=loc+2*(mid-l+1);

  lsum=rsum=0;

  if(lLim<=mid){
    lsum=calcm(l,mid,lSon);
  }
  if(rLim>mid){
    rsum=calcm(mid+1,r,rSon);
  }

  return rsum+lsum;
}

void update(int pos, int val, int loc, int l, int r){
  int lSon, rSon, mid;

  if(l==r){
    aint[loc]-=val;
    return;
  }

  mid=(l+r)/2;
  lSon=loc+1;
  rSon=loc+2*(mid-l+1);

  if(mid>=pos)
    update(pos,val,lSon,l,mid);
  else
    update(pos,val,rSon,mid+1,r);

  aint[loc]=aint[lSon]+aint[rSon];
}

int main() {
    FILE *fin,*fout;
    fin=fopen("datorii.in","r");
    fout=fopen("datorii.out","w");
    int n, m, q, a, b, i;

    fscanf(fin,"%d%d",&n,&m);

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

    build(0,n-1,0);

    while(m--){
      fscanf(fin,"%d%d%d",&q,&a,&b);
      a--;

      if(q==1){
        b--;
        lLim=a;
        rLim=b;
        fprintf(fout,"%d\n",calcm(0,n-1,0));
      }else{
        v[a]-=b;
        update(a,b,0,0,n-1);
      }
    }

    fclose(fin);
    fclose(fout);

    return 0;
}