Cod sursa(job #1608425)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 22 februarie 2016 07:55:46
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 150005
using namespace std;

int N, M;
vector<int> V;

void Update (int poz, int val);
int Find (int val, int st, int dr);
int Query (int poz);


int main()
{
    int val, a, b;
    bool q;
    freopen("aib.in", "rt", stdin);
    freopen("aib.out", "wt", stdout);
    scanf("%d%d", &N, &M);
    V.assign(N+2, 0);
    for(int i=1; i<=N; ++i){
        scanf("%d", &val);
        Update(i, val);
    }
    while(M--)
    {
        scanf("%d", &q);
        if(q == false)
        {
            scanf("%d%d", &a, &b);
            Update(a, -b);
        }
        else
        {
            scanf("%d%d", &a, &b);
            cout<<Query(b)-Query(a-1)<<'\n';
        }
    }
}
void Update(int poz, int val)
{
    while(poz<=N)
    {
        V[poz] +=val;
        poz += poz-(poz&(poz-1));
    }
}
int Query(int poz)
{
    int S=0;
    while(poz>0)
    {
        S+=V[poz];
        poz = poz&(poz-1);
    }
    return S;
}
int Find(int val, int st, int dr)
{
    if(st>dr)
        return -1;
    int mij = st+((dr-st)/2);
    int vmij = Query(mij);
    if(val == vmij)
        return mij;
    else if(val < vmij)
        return Find(val, st, mij-1);
    else
        return Find(val, mij+1, dr);

}