Cod sursa(job #2386581)

Utilizator SoranaAureliaCatrina Sorana SoranaAurelia Data 23 martie 2019 11:35:29
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <cmath>
using namespace std;

int n, m;
long long k;
int arb[32000];
void calc(int st, int dr, int poz)
{
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    calc(st,mij,2*poz);
    calc(mij+1,dr,2*poz+1);
    arb[poz]=arb[poz*2+1]+arb[poz*2];
}

void rez(){

    scanf("%d %d",&n, &m);
    for(k=1; k<=n; k<<=1);

    for(int i=1; i<=n;i++){
        scanf("%d", &arb[i+k-1]);
    }
    calc(1,k, 1);
}
void update(int pozarb, int val)
{
    arb[pozarb]-=val;
    if(pozarb==1)
        return;
    update(pozarb/2,val);
}
void tip0(int valoare, int acata){

    update(acata+k-1,valoare);

}

int tip1(int st, int dr,int a, int b, int pozarb){

    if(st>dr || st>b || dr<a)
        return 0;
    if(a<=st && dr<=b){

        return arb[pozarb];
    }
    else{
        int med=(st+dr)/2;
        int aaa=tip1(st,med,a,b,pozarb*2);
        int bbb=tip1(med+1,dr,a,b,pozarb*2+1);
        return aaa+bbb;
    }
}
void query(){

    int tip, a, b;
    for(int i=1; i<=m; i++){

        scanf("%d %d %d\n",&tip, &a, &b);
        if(tip==0)
            tip0(b,a);
        else printf("%d\n",tip1(1,k,a,b,1));
    }
}

int main(){

    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);

    rez();
    query();

    return 0;
}