Cod sursa(job #563337)

Utilizator bogfodorBogdan Fodor bogfodor Data 24 martie 2011 22:40:52
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#define Lmax 15005

using namespace std;

FILE *fin=freopen("datorii.in","r",stdin);
FILE *fout=freopen("datorii.out","w",stdout);

int n,m,a[Lmax],sum=0,A,B;
int heap[4*Lmax];

void citire()
{
    scanf("%d %d\n", &n, &m);
    for(int i=1;i<=n;i++)
        scanf("%d ", &a[i]);
}

void build(int st, int dr, int nod)
{
    if(st==dr)
    {
        heap[nod]=a[st];
        return;
    }
    int mid=(st+dr)>>1;
    int newnod=nod<<1;
    build(st,mid,newnod);
    build(mid+1,dr,newnod+1);
    heap[nod]=heap[newnod]+heap[newnod+1];
}

void suma(int st, int dr, int nod)
{
    if (A <= st && B >= dr)
    {
        sum+=heap[nod];
        return ;
    }
    int mid = (st + dr) >>1;
    int newnod=nod<<1;
    if(B > mid)
        suma(mid + 1 ,dr,newnod+1);
    if(A <= mid)
        suma(st,mid,newnod);
}

void add(int st, int dr, int nod)
{
    if(st==dr)
    {
        heap[nod]-=B;
        return;
    }
    int mid=(st+dr)>>1;
    int newnod=nod<<1;
    if(A<=mid)
        add(st,mid,newnod);
    else
        add(mid+1,dr,newnod+1);
    heap[nod]=heap[newnod]+heap[newnod+1];
}

void solve()
{
    build(1,n,1);
    for(int i=0;i<m;i++)
    {
        int c;
        scanf("%d %d %d", &c, &A, &B);
        if(c==1){
            sum=0;
            suma(1,n,1);
            printf("%d\n", sum);
        }
        else{
            add(1,n,1);
        }
    }
}

int main()
{
    citire();
    solve();
    return 0;
}