Cod sursa(job #1146247)

Utilizator kiralalaChitoraga Dumitru kiralala Data 18 martie 2014 20:30:04
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#define NMAX 30005

using namespace std;

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

int n;
int a,b;
int tree[NMAX];
int sum;
void Update(int nod, int left, int right)
{
    int mj=left+(right-left)/2;
    if(left==right)
        tree[nod]-=b;
    else {
        if(mj>=a)
            Update(2*nod,left,mj);
        else
            Update(2*nod+1,mj+1,right);
        tree[nod]=tree[nod*2]+tree[nod*2+1];
    }
}

void Ask(int nod, int left, int right)
{
    int mj=left+(right-left)/2;
    if(left>=a&&right<=b) {
            sum+=tree[nod];
    }
    else {
        if(mj<b)
            Ask(2*nod+1,mj+1,right);
        if(mj>=a)
            Ask(2*nod,left,mj);
    }
}

int main()
{
    int m;
    scanf("%d%d",&n,&m);

    for(int i=1;i<=n;++i)
    {
        a=i;
        scanf("%d",&b);
        b=-b;
        Update(1,1,n);
    }

    for(int i=0;i<m;++i)
    {
        int act;
        scanf("%d%d%d",&act,&a,&b);

        if(!act)
            Update(1,1,n);
        else {
            sum=0;
            Ask(1,1,n);
            printf("%d\n",sum);
        }
    }

    return 0;
}