Cod sursa(job #1540493)

Utilizator Vele_GeorgeVele George Vele_George Data 2 decembrie 2015 20:41:40
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;

int AIB[4*nmax];
int n, m, act, x, y;
int sum=0;

void update(int i, int st, int dr, int poz, int val)
{
    if (st == dr) AIB[i] +=val;
    else
    {
        int mid = (st+dr)/2;
        if (poz <= mid) update(i*2, st, mid, poz, val);
                   else update(i*2+1, mid+1, dr, poz, val);
        AIB[i] = AIB[i*2] + AIB[i*2+1];
    }

    return;
}

void find(int i, int st, int dr, int a, int b)
{
    if (a<=st && dr <=b) sum+=AIB[i];
    else
    {
        int mid = (st+dr)/2;
        if (a <= mid) find(i*2, st, mid, a, b);
        if (b  > mid) find(i*2+1, mid+1, dr, a, b);
    }
    return;
}

int bin_search(int a)
{
    int st = 0 ;
    int dr = n+1;
    int mid;
    while(dr - st > 1)
    {
        mid = (st+dr)/2;
        sum =0;
        find(1, 1, n, 1, mid);  /// ---> sum
        if (a <= sum)
        {
            dr = mid;
        }else{
            st = mid;
        }
    }
    sum =0;
    find(1, 1, n, 1, dr);
    if (a==sum) return dr;
                return -1;
}

int main()
{

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

    f >> n >> m;
    for(int i=1; i<=n; i++)
    {
        f >> x;
        update(1, 1, n, i, x);
    }
    for(int i=1; i<=m; i++)
    {
        f >> act;
        if (act == 0){
            f >> x >> y;
            update(1, 1, n, x, y);
        }else
        if (act == 1){
            f >> x >> y;
            sum =0;
            find(1, 1, n, x, y);
            g << sum << "\n";
        }else{
            f >> x;
            g << bin_search(x) << "\n";
        }
    }


    f.close();
    g.close();
    return 0;
}