Cod sursa(job #2612414)

Utilizator stef2003Bud Stefan stef2003 Data 8 mai 2020 22:59:43
Problema Datorii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <cstdio>

using namespace std;

int v[15001], aint[60005], ql, qr;

void build(int nod, int l, int r) {
  int mij;
  if(l>r)
    return;
  if(l==r) {
    aint[nod]=v[l];
    return;
  }
  mij=(l+r)/2;
  build(2*nod,l,mij);
  build(2*nod+1,mij+1,r);
  aint[nod]=aint[2*nod]+aint[2*nod+1];
}

void update(int nod, int l, int r, int poz, int val) {
  int mij;
  if(l>r || poz<l || poz>r)
    return;
  if(l==r) {
    aint[nod]-=val;
    return;
  }
  mij=(l+r)/2;
  update(2*nod,l,mij,poz,val);
  update(2*nod+1,mij+1,r,poz,val);
  aint[nod]=aint[2*nod]+aint[2*nod+1];
}

int query(int nod, int l, int r) {
  int mij, rst, rdr;
  if(qr<l || ql>r || l>r)
    return 0;
  if(ql<=l && qr>=r)
    return aint[nod];
  mij=(l+r)/2;
  rst=query(2*nod,l,mij);
  rdr=query(2*nod+1,mij+1,r);
  return rst+rdr;
}

int main() {
  FILE *fin, *fout;
  int n, m, i, p, a, b;
  fin=fopen("datorii.in","r");
  fout=fopen("datorii.out","w");
  fscanf(fin, "%d%d",&n,&m);
  for(i=1;i<=n;i++)
    fscanf(fin, "%d",&v[i]);
  build(1,1,n);
  for(i=1;i<=m;i++) {
    fscanf(fin, "%d%d%d",&p,&a,&b);
    if(p==1) {
      ql=a;
      qr=b;
      fprintf(fout, "%d\n",query(1,1,n));
    }
    else
      update(1,1,n,a,b);
  }
  fclose( fin );
  fclose( fout );
  return 0;
}