Cod sursa(job #1950324)

Utilizator Train1Train1 Train1 Data 2 aprilie 2017 21:43:44
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#define maxN 100001
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m;
int v[maxN];
int mark[maxN];
int getParent(int k) {
    return (k&(k-1));
}
int nextNode(int k) {
    return k + (k & -k);
}
void update(int pos, int val) {
    while(pos <= n) {
        v[pos] += val;
        pos = nextNode(pos);
    }
}
int sum(int k) {
    int s = 0;
    while(k) {
        s+= v[k];
        k=getParent(k);
    }
    return s;
}
int main()
{
    fin>>n>>m;
    int x, y, op;
    for(int i = 1; i <= n; i++) {
        fin>>x;
        update(i, x);
    }
    for(int j = 1; j <= m; j++) {
        fin>>op;
        if(op == 0) {
            fin>>x>>y;
            update(x, y);
        } else if(op == 1) {
            fin>>x>>y;
            fout<<sum(y) - sum(x-1)<<'\n';
        } else {
            fin>>x;
            int ok = 0;
            for(int i = 1; i <= n; i++) {
                int p = i;
                int s = sum(p);
                while(p && mark[p] != i) {
                    mark[p] = i;
                    if(s == x) {
                        fout<<p<<'\n';
                        ok = 1;
                        break;
                    }
                    s = s - v[p];
                    p=getParent(p);
                }
                if(ok == 1)
                    break;
            }
        }
    }
    fin.close();
    fout.close();
    return 0;
}