Cod sursa(job #1766541)

Utilizator ducu34Albastroiu Radu Gabriel ducu34 Data 28 septembrie 2016 05:49:35
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
//
//  main.cpp
//  Aib
//
//  Created by Albastroiu Radu on 9/28/16.
//  Copyright © 2016 Albastroiu Radu. All rights reserved.
//


#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

int aib[100001], n, m, i, x, tip, a, b;

void update(int poz, int val)
{
    if(poz > n)
        return;
    
    aib[poz] += val;
    poz += poz & (-poz);
    
    update(poz, val);
}

int querry(int poz)
{
    int s = 0;
    while(poz)
    {
        s += aib[poz];
        poz -= poz & (-poz);
    }
    return s;
}

int search(int val)
{
    int power, i = 0;
    
    for(power = 1; power < n;)
        power *= 2;
    
    while(power)
    {
        if(i + power <= n)
        {
            if(val >= aib[i + power])
            {
                i += power;
                val -= aib[i];
                if(!val)
                    return i;
            }
        }
        power /= 2;
    }
    return -1;
}

int main()
{
    
    fin >> n >> m;
    
    for(i = 1; i <= n; i++)
    {
        fin >> x;
        update(i, x);
    }
    
    for(i = 1; i <= m; i++)
    {
        fin >> tip >> a;
        
        if(tip < 2)
        {
            fin >> b;
            
            if(tip)
                fout << querry(b) - querry(a-1) << "\n";
            else
                update(a, b);
            
        }
        else
        {
            fout << search(a) << "\n";
        }
    }
    
    return 0;
}