Cod sursa(job #2325157)

Utilizator rares1012Rares Cautis rares1012 Data 22 ianuarie 2019 00:18:33
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define DIM 1000000

char BUFF[DIM];

FILE*fi;

int k=0;

int citeste(){
    int numar=0;
    while(BUFF[k]<'0' || BUFF[k]>'9'){
        k++;
        if(k==DIM){
            fread(BUFF,1,DIM,fi);
            k=0;
        }
    }
    while(BUFF[k]>='0' && BUFF[k]<='9'){
        numar=BUFF[k]+numar*10-'0';
        k++;
        if(k==DIM){
            fread(BUFF,1,DIM,fi);
            k=0;
        }
    }
    return numar;
}

int aint[60001];

int sol;

void update(int nod,int val,int st,int dr,int p){
    if(st==dr)
        aint[p]+=val;
    else {
        int mij=(st+dr)/2;
        if(nod<=mij){
            update(nod,val,st,mij,p*2);
        }
        else {
            update(nod,val,mij+1,dr,p*2+1);
        }
        aint[p]=aint[p*2]+aint[p*2+1];
    }
}

int calc(int a,int b,int st,int dr,int p){
    if(a<=st && dr<=b)
        sol+=aint[p];
    else {
        int mij=(st+dr)/2,s=0;
        if(a<=mij){
            calc(a,b,st,mij,p*2);
        }
        if(b>mij){
            calc(a,b,mij+1,dr,p*2+1);
        }
    }
}

int main()
{
    int n,q,i,k,t,a,b;
    FILE*fo;
    fi=fopen("datorii.in","r");
    fo=fopen("datorii.out","w");
    n=citeste();
    q=citeste();
    for(i=1;i<=n;i++){
        k=citeste();
        update(i,k,1,n,1);
    }
    for(i=0;i<q;i++){
        t=citeste();
        if(t==1){
            a=citeste();
            b=citeste();
            sol=0;
            calc(a,b,1,n,1);
            fprintf(fo,"%d\n",sol);
        }
        else {
            a=citeste();
            b=citeste();
            b=-b;
            update(a,b,1,n,1);
        }
    }
    fclose(fo);
    fclose(fi);
    return 0;
}