Cod sursa(job #1542412)

Utilizator Vele_GeorgeVele George Vele_George Data 5 decembrie 2015 12:49:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#define nmax 100005

using namespace std;

int AIB[nmax], n, m;

inline int last_bit(int x)
{
    return x & (-x);
    ///sau i - (i & (i-1))
}


void update(int poz, int val)
{
    for(int i=poz; i<=n; i= i+last_bit(i))
    {
        AIB[i]+=val;
    }

    return;
}

int querry(int poz)
{
    int sum=0;
    for(int i=poz; i>=1; i = i-last_bit(i))
    {
        sum+=AIB[i];
    }

    return sum;
}

int cb(int k)
{
    int st=0, dr=n+1, mid;
    while(dr - st > 1)
    {
        mid = (st+dr)/2;
        if (k <= querry(mid)) dr = mid;
                       else   st = mid;
    }
    if(querry(dr) == k)
        return dr;

    return -1;
}

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

    int act, x, y;
    f >> n >> m;
    for(int i=1; i<=n; i++)
    {
        f >> x;
        update(i, x);
    }

    for(int i=1; i<=m; i++)
    {
        f >> act;
        if (act == 0)
        {
            f >> x >> y;
            update(x, y);

        }else
        if (act == 1)
        {
            f >> x >> y;
            g << querry(y)- querry(x-1) << "\n";

        }
        else{
            f >> x;
            g << cb(x) << "\n";
        }
    }




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