Cod sursa(job #2431138)

Utilizator bluestorm57Vasile T bluestorm57 Data 18 iunie 2019 11:57:15
Problema Arbori indexati binar Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

const int NMAX = 4e5 + 40;
int n,m,aib[NMAX],sum,pos,val;
int soum[NMAX],o;

void build(int nod, int st, int dr){
    if(st == dr){
        f >> aib[nod];
        soum[++o] = soum[o - 1] + aib[nod];
        return;
    }
    int mid = (st + dr) / 2;
    build(2 * nod, st, mid);
    build(2 * nod + 1 , mid + 1, dr);
    aib[nod] = aib[2 * nod] + aib[2 * nod + 1];
}

void update1(int nod, int st, int dr, int x, int y){
    if(st == dr){
        aib[nod] += y;
        return;
    }
    int mid = (st + dr) / 2;
    if(x <= mid){
        update1(2 * nod, st, mid, x, y);
    }else{
        update1(2 * nod + 1, mid + 1, dr, x, y);
    }
    aib[nod] = aib[2 * nod] + aib[2 * nod + 1];
}

void suma(int nod, int st, int dr, int x, int y){
    if(st >= x && y >= dr){
        sum += aib[nod];
        return;
    }
    int mid = (st + dr) / 2;
    if(x <= mid)
        suma(2 * nod, st, mid, x, y);
    if(mid + 1 <= y)
        suma(2 * nod + 1, mid + 1 , dr , x , y);
}

void det_pos(){
    int i;
    for(i = 1 ; i <= n ; i++){
        if(soum[i] == val)
            pos = i, i = n + 5;
    }
}

int main(){
    int i,a,b,cer;
    f >> n >> m;
    build(1,1,n);
    for(i = 1 ; i <= m ; i++){
        f >> cer;
        if(cer == 0){
            f >> a >> b;
            update1(1,1,n,a,b);
            for(int j = a ; j <= n ; j++)
                soum[j] += b;
        }else
            if(cer == 1){
                f >> a >> b;
                sum = 0;
                suma(1,1,n,a,b);
                g << sum << "\n";
            }else{
                f >> a;
                val = a;
                pos = -1;
                det_pos();
                g << pos << "\n";
            }
    }

    //for(i = 1 ; i <= 4 * n ; i++)
        //g << aib[i] << " ";

    return 0;
}