Cod sursa(job #1523909)

Utilizator kassay_akosKassay Akos kassay_akos Data 13 noiembrie 2015 14:33:32
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <iostream>
#include <fstream>
using namespace std;
//2.100.000.000

int n,m,sum;
int arb[70000];     //15.000*4+66

void Init(int nodID, int start, int finish, int pos, int val);
void Update(int nodID, int start, int finish, int pos, int val);
void Querry(int nodID, int start, int finish, int from, int to);

int main()
{
    freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);

    scanf("%d%d",&n,&m);
    int X,A,B;

    for(int i = 1; i<=n; i++) {
        scanf("%i",&X);
        Init(1,1,n,i,X);
    }
    for (int i = 0;i < m; i++) {
        scanf("%i %i %i",&X,&A,&B);
        if (X==0) {
            Update(1,1,n,A,B);
        }
        else {
            sum = 0;
            Querry(1,1,n,A,B);
            printf("%i \n",sum);
        }

    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

void Init(int nodID, int start, int finish, int pos, int val){
    if (start==finish) {
        arb[nodID] = val;
        return;
    }

    int mid = (start + finish) /2 ;
    if (pos <= mid ) {
        Init(nodID*2,start,mid,pos,val);
    }
    else {
        Init(nodID*2+1,mid+1,finish,pos,val);
    }
    arb[nodID] = arb[nodID*2] + arb[nodID*2+1] ;
}


void Update(int nodID, int start, int finish, int pos, int val){
    if (start==finish) {
        arb[nodID] = arb[nodID] - val;
        return;
    }

    int mid = (start + finish) /2 ;
    if (pos <= mid ) {
        Update(nodID*2,start,mid,pos,val);
    }
    else {
        Update(nodID*2+1,mid+1,finish,pos,val);
    }
    arb[nodID] = arb[nodID*2] + arb[nodID*2+1] ;
}


void Querry(int nodID, int start, int finish, int from, int to){
    if (from <= start && finish <= to) {
        sum += arb[nodID];
        return;
    }

    int mid = (start + finish) /2 ;
    if (from <= mid ) {
        Querry(nodID*2,start,mid,from,to);
    }
    if (mid < to) {
        Querry(nodID*2+1,mid+1,finish,from, to);
    }
}