Cod sursa(job #1773939)

Utilizator BarbumateiBarbu Matei Barbumatei Data 8 octombrie 2016 13:19:19
Problema Datorii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define flip(a) (a&(-a))
#define MAXN 15001
#define LU (1<<17)
FILE *fin, *fout;
int arb[MAXN], n, pos, pos1;
char buff[LU], buff1[LU], ch;

inline char nextr(){
  if(pos==LU){
    fread(buff, LU, 1, fin);
    pos=0;
  }
  return buff[pos++];
}

inline void read(int *x){
  *x=0;
  ch=nextr();
  while(!isdigit(ch)) ch=nextr();
  while(isdigit(ch)){
    *x=(*x)*10+ch-'0';
    ch=nextr();
  }
}

inline void nextp(){
  if(pos1==LU){
    fwrite(buff1, LU, 1, fout);
    pos1=0;
  }
  buff1[pos1++]=ch;
}

inline void print(int x){
  char s[10], c=0;
  while(x){
    s[c++]=x%10+'0';
    x/=10;
  }
  while(c>0){
    ch=s[--c];
    nextp();
  }
}

inline int suma(int i){
  int sum=0, j;
  for(j=i; j>0; j-=flip(j))
    sum+=arb[j];
  return sum;
}

inline void insert(int i, int a){
  int j;
  for(j=i; j<=n; j+=flip(j)){
    arb[j]+=a;
  }
}

int main(){
  int i, m, x, a, b;
  fin=fopen("datorii.in", "r");
  fout=fopen("datorii.out", "w");
  read(&n);
  read(&m);
  for(i=1; i<=n; i++){
    read(&x);
    insert(i, x);
  }
  for(i=0; i<m; i++){
    read(&x); read(&a); read(&b);
    if(x==0)
      insert(a, -b);
    else{
      print(suma(b)-suma(a-1));
      ch='\n';
      nextp();
    }
  }
  if(pos1) fwrite(buff1, LU, 1, fout);
  fclose(fin);
  fclose(fout);
    return 0;
}