Cod sursa(job #2182806)

Utilizator tudorbuhniaTudor Buhnia tudorbuhnia Data 22 martie 2018 17:21:35
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
using namespace std;
int v[100005],aib[100005],sp[100005],n;
#define zeros(x) (x&-x)
void update(int poz,int val)
{
		for(;poz<=n;poz=poz+zeros(poz))
				aib[poz]+=val;
}
int query(int poz)
{
		int s=0;
		for(;poz>0;poz=poz-zeros(poz))
				s+=aib[poz];
		return s;
}
int main()
{
		ifstream cin("aib.in");
		ofstream cout("aib.out");
    int k,l,cer,a,b,x,y,st,dr,mid;
    cin >> n >> k;
    for(int i=1;i<=n;i++)
    {
				cin >> v[i];
				sp[i]=sp[i-1];
				sp[i]+=v[i];
				l=i-zeros(i);
				aib[i]=sp[i]-sp[l];
    }
    for(int i=0;i<k;i++)
    {
				cin >> cer;
				if(cer==0)
				{
						cin >> a >> b;
						update(a,b);
				}
				if(cer==1)
				{
						cin >> a >> b;
						x=query(b);
						y=query(a-1);
						cout << x-y << endl;
				}
				if(cer==2)
				{
					  int sol=-1;
						cin >> a;
						st=1;
						dr=n;
						while(st<=dr)
						{
								mid=(st+dr)/2;
								if(query(mid)<a)
										st=mid+1;
								if(query(mid)>a)
										dr=mid-1;
								if(query(mid)==a)
								{
									st=mid+1;
									sol=mid;
								}
						}
						cout << sol << endl;
				}
    }
    return 0;
}