Cod sursa(job #613658)

Utilizator dacyanMujdar Dacian dacyan Data 3 octombrie 2011 10:45:02
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <vector>
#define DIM 101000
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");
 
int n, q, tip;
int aib[DIM];

void Read();
void Update(int poz, int val);
int Query(int poz);
int Binar(int);

int main()
{
    Read();
    
    int a, b;
    for (int i = 1; i <= q; ++i)
    {
        fin >> tip; 
		if (!tip)
		{
			fin >> a >> b;
			Update(a, b);
		}
		if (tip == 1)
		{
			fin >> a >> b;
			if (a > b) swap(a,b);
            fout << Query(b) - Query(a-1) << '\n';
		}
		if (tip == 2)
		{
			fin >> a;
			fout << Binar(a) << '\n';
		}
    }
    fin.close();
    fout.close();
    return 0;
}

void Update (int poz, int val)
{
    for (int i = poz; i <= n; i += (i & -i))
        aib[i] += val;
}    
                        
int Query(int poz)
{
    int sum = 0;
    for (int i = poz; i; i -= (i & -i))
        sum += aib[i];
    return sum;
}                                   
                
    

void Read()
{    
    fin >> n >> q;
    int val;
    for (int i = 1; i <= n; ++i)
    {
        fin >> val;
        Update(i, val);
    }
}    

int Binar(int sum)
{
    int st(1), dr(n), mij;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        int Q = Query(mij);
        if (Q == sum) return mij;
        if (Q > sum) dr = mij - 1;
        if (Q < sum) st = mij + 1;
    }
    return -1;
}