Cod sursa(job #1816356)

Utilizator MarcSpataruMarc Spataru MarcSpataru Data 26 noiembrie 2016 13:15:57
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<cstdio>
using namespace std;
int v[15000*4];
int max(int a,int b)
{
    if(a<b)
        return b;
    return a;
}
void update(int val, int poz, int st, int dr, int poz2)
{
    int mij;
    if(st==dr)
    {
        v[poz2]-=val;
        return;
    }
    mij=(st+dr)/2;
    if(poz<=mij)
        update(val,poz,st,mij,2*poz2);
    else
        update(val,poz,mij+1,dr,2*poz2+1);
    v[poz2]=v[2*poz2]+v[2*poz2+1];
}
int ans;
void query(int nod, int left, int right, int a, int b)
{
    if(a<=left&&right<=b)
    {
        ans=ans+v[nod];
        return;
    }
    int mid=(left+right)/2;
    if(a<=mid)
        query(nod*2, left, mid, a, b);
    if(mid<b)
        query(nod*2+1, mid+1, right, a, b);
}
int vec[15001];
void build(int n)
{
    int i;
    for(i=n;i<=n*2-1;i++)
    {
        v[i]=vec[i-n+1];
    }
    int k=n/2;
    while(k!=1)
    {
        for(i=k;i<=k*2-1;i++)
        {
            v[i]=v[i*2]+v[i*2+1];
        }
        k/=2;
        if(k==1)
            v[1]=v[2]+v[3];
    }
}
int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    int n,m,i,j,f=1,t,x,y;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&vec[i]);
    for(i=1;i<=31;i++)
    {
        f*=2;
        if(n<f)
        {
            n=f;
            break;
        }
    }
    build(n);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t,&x,&y);
        if(t==0)
        {
            update(y,x,1,n,1);
        }
        if(t==1)
        {
            ans=0;
            query(1,1,n,x,y);
            printf("%d\n",ans);
        }
    }
    return 0;
}