Cod sursa(job #1768407)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 30 septembrie 2016 20:40:06
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#define LIM 131072
#include <ctype.h>
//solutia cu parsare
using namespace std;
FILE *fi;
int copac[60000], a, b, poz=LIM;
char BUF[LIM];

char getChar(){
  poz++;
  if(poz>=LIM){
    fread(BUF,LIM,1,fi);
    poz=0;
  }
  return BUF[poz];
}

int getNr(){
  int r=0, semn=1;
  char ch=getChar();
  while(isdigit(ch)==0) ch=getChar();
  while(isdigit(ch)!=0){
    r=r*10+semn*(ch-'0');
    ch=getChar();
  }
  return r;
}

void add(int nod, int st, int dr){
    if(st==dr && st==a){
        copac[nod]+=b;
        return;
    }
    int div=(dr+st)/2;
    if(a<=div)
        add(2*nod,st,div);
    else
        add(2*nod+1,div+1,dr);
    copac[nod]=copac[2*nod+1]+copac[2*nod];
}

int query(int nod, int st, int dr){
    if(a<=st && dr<=b)
        return copac[nod];
    int rez=0, div=dr+st;
    div/=2;
    if(a<=div)
        rez=query(2*nod,st,div);
    if(b>div)
        rez+=query(2*nod+1,div+1,dr);
    return rez;
}

int main()
{
    int n, m, i, c;
    fi=fopen("datorii.in", "r");
    FILE *fo=fopen("datorii.out", "w");
    n=getNr();
    m=getNr();
    for(i=1;i<=n;i++){
        b=getNr();
        a=i;
        add(1,1,n);
    }
    for(i=1;i<=m;i++){
        c=getNr(); a=getNr(); b=getNr();
        if(c==1)
            fprintf(fo, "%d\n", query(1,1,n));
        else{
            b=-b;
            add(1,1,n);
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}