Cod sursa(job #2325153)

Utilizator rares1012Rares Cautis rares1012 Data 22 ianuarie 2019 00:01:07
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>

int aint[60001];

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)
        return aint[p];
    else {
        int mij=(st+dr)/2,s=0;
        if(a<=mij){
            s+=calc(a,b,st,mij,p*2);
        }
        if(b>mij){
            s+=calc(a,b,mij+1,dr,p*2+1);
        }
        return s;
    }
}

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