Cod sursa(job #1777112)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 12 octombrie 2016 07:44:31
Problema Datorii Scor 100
Compilator c Status done
Runda cerculdeinfo-lectia2-arborideintervale Marime 1.09 kb
#include <stdio.h>
#include <stdlib.h>
int s[2000000];
void update(int st,int dr,int x,int pos,int k)
{
    if(st<dr){
        if(k<=(st+dr)/2)
            update(st,(st+dr)/2,x,pos*2,k);
        else
            update((st+dr)/2+1,dr,x,pos*2+1,k);
        s[pos]=s[pos*2]+s[pos*2+1];
    }
    else
        s[pos]+=x;
}
int search_sum(int st,int dr,int pos,int a,int b)
{
    if(a<=st && b>=dr)
        return s[pos];
    else{
        int m1,m2;
        m1=m2=0;
        if(a<=(st+dr)/2)
            m1+=search_sum(st,(st+dr)/2,pos*2,a,b);
        if(b>(st+dr)/2)
            m2+=search_sum((st+dr)/2+1,dr,pos*2+1,a,b);
        return m1+m2;
    }
}
int main()
{
    int n,q,i,x,c,a,b;
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d%d",&n,&q);
    for(i=1; i<=n; i++){
        scanf("%d",&x);
        update(1,n,x,1,i);
    }
    for(i=1; i<=q; i++)
    {
        scanf("%d%d%d",&c,&a,&b);
        if(c==1)
            printf("%d\n",search_sum(1,n,1,a,b));
        else
            update(1,n,-b,1,a);
    }

    return 0;
}