Cod sursa(job #1548772)

Utilizator tiby10Tibi P tiby10 Data 11 decembrie 2015 15:17:22
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100003
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, a[MAXN], t[4*MAXN], sum;

void pre(int node, int b, int e){
    if(b==e){
        t[node]=a[b];
        return;
    }
    int m=b+e>>1;
    pre(node*2, b, m);
    pre(node*2+1, m+1, e);
    t[node]=t[node*2]+t[node*2+1];
}

void query(int node, int b, int e, int l, int r){
    if(b>=l && e<=r){
        sum+=t[node];
        return;
    }
    if(e<l || b>r)
        return;
    int m=b+e>>1;
    query(node*2, b, m, l, r);
    query(node*2+1, m+1, e, l, r);
}

int query2(int node, int b, int e, int val){
    if(b==e)
        return b;
    int m=b+e>>1;
    if(val<=t[node*2])
        return query2(node*2, b, m, val);
    else
        return query2(node*2+1, m+1, e, val);

}

void update(int node, int b, int e, int pos, int val){
    if(b==e){
        t[node]+=val;
        return;
    }
    int m=b+e>>1;
    if(pos<=m) update(node*2, b, m, pos, val);
    else update(node*2+1, m+1, e, pos, val);
    t[node]=t[node*2]+t[node*2+1];
}

int main ()
{
    int i, x, y, type;
    fin>>n>>m;
    for(i=1; i<=n; ++i) fin>>a[i];
    pre(1, 1, n);
    while(m--){
        fin>>type>>x;  // x pos;  2 doar x
        if(type==0){
            fin>>y;
            update(1, 1, n, x, y);
        }
        else if(type==1){
            fin>>y;
            sum=0;
            query(1, 1, n, x, y);
            fout<<sum<<'\n';
        } else
            fout<<query2(1, 1, n, x)<<'\n';
    }
    return 0;
}