Cod sursa(job #1954349)

Utilizator the.manIon Man the.man Data 5 aprilie 2017 12:43:24
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");

int a[100001];
int n;

int Query(int poz)
{
	int s = 0;
	for ( int i = poz; i; i -= i & -i)
		s += a[i];
	return s;
}

void Update(int poz, int v)
{
	for ( int i = poz; i <= n; i += i & -i )
		a[i] += v;
}

int Search(int x)
{
    int st=1,dr=n,mij;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        int nr=Query(mij);
        if (nr==x) return mij;
        if (nr<x) st=mij+1;
             else dr=mij-1;
    }
    return -1;
}
int main()
{
	int v, m;
	fi >> n >> m;       // m - nr de intrebari 0 - update, 1 query
	for ( int i = 1; i <= n; ++i )
	{
		fi >> v;
		Update(i, v);
	}
	int c, p1, p2, x;
	for ( int i = 1; i <= m; ++i )
	{
		fi >> c;
		if ( c==0 )
		{
			fi >> p1 >> v;
			Update(p1, v);
		}
		if (c==1)
		{
			fi >> p1 >> p2;
			fo << Query(p2) - Query(p1 - 1) << '\n';
		}
		if (c==2)
       {
           fi>>x;
           fo<<Search(x)<<'\n';
       }
	}

	fi.close();
	fo.close();
	return 0;
}