Cod sursa(job #313336)

Utilizator SleepyOverlordPatcas Csaba SleepyOverlord Data 8 mai 2009 20:13:24
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
//Code by Patcas Csaba
//Time complexity:
//Space complexity:
//Method:
//Working time: 20 minutes

#include <stdio.h>
#include <ctype.h>
#include <vector>
#include <string> 
#include <set> 
#include <map> 
#include <iostream> 
#include <sstream> 
#include <numeric> 
#include <algorithm> 
#include <cmath> 
#include <queue> 
#include <bitset> 
#include <time.h>
#include <assert.h>

using namespace std;

#define in_file "aib.in"
#define out_file "aib.out"

#define VI vector <int>
#define FORN(i,n) for(int i=0;i<n;++i)
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define S size()
#define B begin() 
#define E end() 
#define X first
#define RS resize
#define Y second
#define PB push_back
#define MP make_pair
#define ALL(x) x.begin(),x.end()
#define repeat do{ 
#define until(x) }while(!(x)); 

#define left node<<1
#define right node<<1|1

int n, m;
VI a, ai;

int query(int node, int down, int up, int d, int u)
{
	if (d<=down && up<=u) return ai[node];
	int mid= (down + up) / 2, ans=0;
	if (d<=mid) ans+=query(left,down,mid,d,u);
	if ((mid+1)<=u) ans+=query(right,mid+1,up,d,u);
	return ans;
}

void update(int node, int down, int up, int ind, int val)
{
	if (down==up)
	{
		ai[node]+=val;
		return ;
	}
	int mid= (down + up) / 2, ans=0;
	if (ind<=mid) update(left,down,mid,ind,val);
	else update(right,mid+1,up,ind,val);
	ai[node]=ai[left]+ai[right];
}

int build(int node, int down, int up)
{
	if (down==up) 
	{
		ai[node]=a[down];
		return a[down];
	}
	int mid= (down + up) / 2, ans;
	ans=build(left,down,mid);
	ans+=build(right,mid+1,up);
	ai[node]=ans;
	return ans;
}

int query2(int node, int down, int up, int sum)
{
	if (down==up) return down;
	int mid= (down + up) / 2;
	if (sum<=ai[left]) return query2(left,down,mid,sum);
	else return query2(right,mid+1,up,sum);
}

int main()
{
	FILE* fin=fopen(in_file,"r");
	FILE* fout=fopen(out_file,"w");
	fscanf(fin,"%d%d",&n,&m);
	int pow2=1;
	while (pow2<=n) pow2<<=1;
	ai.RS((pow2<<1)+1);
	a.RS(n+1);
	FOR(i,1,n) fscanf(fin,"%d",&a[i]);
	build(1,1,n);
	FORN(i,m)
	{
		int x, y, z;
		fscanf(fin,"%d%d",&x,&y);
		if (x!=2) fscanf(fin,"%d",&z);
		if (x==0) update(1,1,n,y,z);
		else
			if (x==1)	fprintf(fout,"%d\n",query(1,1,n,y,z));
			else fprintf(fout,"%d\n",query2(1,1,n,y));
	}
	fclose(fin);
	fclose(fout);

	return 0;
}