Cod sursa(job #2325239)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 22 ianuarie 2019 12:30:25
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>

using namespace std;
FILE *in,*out;

int n,m,pos,val,start,finish,sol;
int sum[100002];

void update(int nod,int left, int right){
  if(left==right){
    sum[nod]+=val;
    return;
  }
  int mij=(left+right)/2;
  if(mij>=pos)
    update(nod*2,left,mij);
  else
    update(2*nod+1,mij+1,right);
  sum[nod]=sum[nod*2]+sum[nod*2+1];
}

void read(){
  int x;
  fscanf(in,"%d %d",&n,&m);
  for(int i=1;i<=n;i++){
    fscanf(in,"%d",&x);
    pos=i,val=x;
    update(1,1,n);
  }
}

void query(int nod,int left, int right){
  if(left>=start && right<=finish){
    sol+=sum[nod];
    return;
}
  int mij=(left+right)/2;
  if(start<=mij)
    query(2*nod,left,mij);
  if(mij<finish)
    query(2*nod+1,mij+1,right);
  }

void solve(){
  int q;
  for(int i=1;i<=m;i++){
    fscanf(in,"%d",&q);
    if(q){
      fscanf(in,"%d %d",&start,&finish);
      sol=0;
      query(1,1,n);
      fprintf(out,"%d\n",sol);
    }
    else{
      fscanf(in,"%d %d",&pos,&val);
      val=-1*val;
      update(1,1,n);
    }
  }
}

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

    read();
    solve();
    return 0;
}