Cod sursa(job #1793338)

Utilizator MithrilBratu Andrei Mithril Data 30 octombrie 2016 22:26:10
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");
typedef unsigned int uint;
int n,m;
vector<int> arbore;
int x,y,caz;

inline uint getParent(uint queriedNode){
    uint aux=~queriedNode+1;
    aux=queriedNode&aux;
    return queriedNode-aux;
}

inline uint getNext(uint queriedNode){
    uint aux=~queriedNode+1;
    aux=queriedNode&aux;
    return queriedNode+aux;
}

void update(int poz, int val, bool minus){
    while(poz<=n){
        if(minus)arbore[poz]-=val;
        else arbore[poz]+=val;
        poz=getNext(poz);
    }
}

int query(int poz){
    int sum=0;
    while(poz>0){
        sum+=arbore[poz];
        poz=getParent(poz);
    }
    return sum;
}

int main()
{
    fin>>n>>m;
    arbore.resize(n+1);
    for(int i=1;i<=n;i+=1){fin>>x;update(i,x,0);}
    for(;m;m-=1){
        fin>>caz>>x>>y;
        if(caz==0)update(x,y,1);
        else fout<<query(y)-query(x-1)<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}