Cod sursa(job #1231318)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 20 septembrie 2014 12:01:04
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>

using namespace std;

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

int n,m,i,st,dr,j,op,a,b,mid,A[10010],x;

void update(int p, int v) {
	for (int i=p;i<=n;i+=(i&-i))
		A[i] += v;
}

int query(int p) {
	int suma = 0;
	for  (int i=p;i>0;i-=(i&-i))
		suma += A[i];
	return suma;
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++){
    	fin>>x;
    	update(i, x);
    }
	for(j=1;j<=m;j++){
		fin>>op;
		if(op == 0){
			fin>>a>>b;
			update(a, b);
		}
		else
			if(op == 1){
				fin>>a>>b;
				fout<<query(b)-query(a-1)<<'\n';
			}
			else{
				fin>>a;
				st=1;
				dr=n;
				while(st<=dr){
					mid=(st+dr)/2;
					if(query(mid)>a)
						dr=mid-1;
					else
						if(query(mid) == a){
							fout<<mid<<'\n';
							break;
						}
						else
							st=mid+1;
				}
				if(st>dr)
					fout<<-1<<'\n';

			}


	}

    return 0;
}