Cod sursa(job #1149313)

Utilizator DanutsDanut Rusu Danuts Data 21 martie 2014 17:41:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
#include<iostream>
#include<cstdio>
#define maxn 150100
using namespace std;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
int n,m,v[maxn],x,poz;
int a,b,cod;
void update(int poz,int val){
    while(poz<=n){
        v[poz]+=val;
        poz+=(poz&-poz);
    }
}
int aduna(int st,int dr){
    int s1=0,s2=0;
    st--;
    while(st>0){
        s1+=v[st];
        st-=(st&-st);
    }
    while(dr>0){
        s2+=v[dr];
        dr-=(dr&-dr);
    }
    return s2-s1;
}
void minim(int a){
    int ok=0,s=0;
	poz=1;
	while(poz<n)
		poz+=(poz&-1);
	//fprintf(g,"%d\n",poz);
	while(poz>0){
		if(poz+s<=n){
			if(a>=v[poz+s]){
				s+=poz;
				a-=v[s];
			if(a==0)
				fprintf(g,"%d\n",s),ok=1;
			}
		}
		poz=poz>>1;;
	}
	if(ok==0)
		fprintf(g,"%d\n",-1);
}
int main()
{
    fscanf(f,"%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        poz=i;
        fscanf(f,"%d",&x);
        update(poz,x);
    }
    //for(int i=1;i<=n;i++)
    //    fprintf(g,"%d ",v[i]);
    for(int i=1;i<=m;i++){
            fscanf(f,"%d",&cod);
        if(cod==0){
            fscanf(f,"%d%d",&a,&b);
            poz=a;
            update(poz,b);
            // for(int i=1;i<=n;i++)
            //    fprintf(g,"%d ",v[i]);
        }
        else
                if(cod==1){
                    fscanf(f,"%d%d",&a,&b);
                    fprintf(g,"%d\n",aduna(a,b));
                }
                else
                    {
                        fscanf(f,"%d",&a);
						minim(a);
						//fprintf(g,"%d\n",valm(a));
                    }
    }
    return 0;
}