Cod sursa(job #1654008)

Utilizator petru.cehanCehan Petru petru.cehan Data 16 martie 2016 19:19:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int n,m;
vector<int> tree(NMAX);

void update(int poz, int val)
{
    while(poz <= n)
        tree[poz] += val , poz += poz & -poz;
}

int query(int poz)
{
    int S = 0;
    while (poz)
        S += tree[poz], poz -= poz & -poz;
    return S;
}

int query2(int val)  // binary_search
{
    int mij, st = 1, dr = n;

    while (st <= dr)
    {
        mij = (st + dr) >> 1;
        if (query (mij) == val)
             return mij;

        if (query (mij) < val)
            st = ++ mij ;

        else
            dr = -- mij ;
    }
    return -1;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d%d",&n,&m);
    int val;
    for(int i = 1 ; i <= n ; ++ i)
        scanf("%d",&val), update(i,val);
    int op,a,b;
    while(m >= 1)
    {
        scanf("%d ", &op);
        switch(op)
        {
            case 0 : // operatia de tip 0: se adauga la elementul de pe pozitia a valoarea b
                scanf("%d%d", &a, &b ) ;
                update(a, b);
                break;
            case 1 : // operatia de tip 1: se determina suma pe intervalul [a,b]
                scanf ("%d%d", &a, &b) ;
                printf ("%d\n" , query(b)-query(a-1)) ;
                break;
            case 2 : // operatia de tip 2 : se determina poz minima astfel incat suma sa fie valoarea respectiva
                scanf ("%d", &a) ;
                printf ("%d \n", query2(a)) ;
                break ;
        }
       -- m ;
    }
}