Cod sursa(job #1498898)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 9 octombrie 2015 20:59:14
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#define NMAX 100001

using namespace std;

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

int v[NMAX],aib[NMAX],n,m,t,a,b;

int bit(int x)
{
    return x&(-x);
}

void citire()
{
    in >> n >> m;
    for(int i=1;i<=n;i++)
    {
        in >> v[i];
    }
}

void update(int i,int delta)
{
    for(;i<=n;i+=bit(i))
        aib[i]+=delta;
}

int sum(int i)
{
   int suma = 0;
   for(;i>0;i-=bit(i))
        suma = suma + aib[i];
   return suma;
}

int bin(int x)
{
    int st =1,dr=n,mij,s;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        s = sum(mij);
        if(s==x) return mij;
        else if(s < x)
            st = mij+1;
            else if(s>x) dr = mij-1;
    }
    return -1;
}

int s;
int main()
{
   citire();

   for(int i=1;i<=n;i++)
        update(i,v[i]);

    for(int i=0;i<m;i++){
    in >> t;
    if(t==0)
    {
        in >> a >> b;
        update(a,b);
    }
    else if(t==1)
    {
        in >> a >> b;
        s = 0;
        s = sum(b) - sum(a-1);
        out << s << "\n";
    }
    else
    {
        in >> a;
        out << bin(a) << "\n";
    }
    }
    return 0;
}