Cod sursa(job #2325262)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 22 ianuarie 2019 13:26:14
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 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];
}

int citeste(){
  int nr=0;
  char s[100];
  fscanf(in,"%s",&s);
  int k=0;
  while(s[k]<'0' && s[k]>'9')
    k++;
  while(s[k]>='0' && s[k]<='9')
    nr=nr*10+s[k++]-'0';
  return nr;
}

void read(){
  int x;
  n=citeste();
  m=citeste();
  for(int i=1;i<=n;i++){
    x=citeste();
    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++){
    q=citeste();
    if(q){
      start=citeste();
      finish=citeste();
      sol=0;
      query(1,1,n);
      fprintf(out,"%d\n",sol);
    }
    else{
      pos=citeste();
      val=citeste();
      val*=-1;
      update(1,1,n);
    }
  }
}

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

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