Cod sursa(job #1760870)

Utilizator dodecagondode cagon dodecagon Data 21 septembrie 2016 13:25:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>

int bit[100009],n,m,i,x,y,z,p;

int next_int(FILE * in)
{
	char x,y;
	int z=0;;
	 
	 x=1;

	  while (x<48 || x> 57)
	  	y=fread(&x,1,1,in);

      while (x>=48 && x<=57)
      	z=(z<<1)+(z<<3)+x-48,y=fread(&x,1,1,in);

    return z;
}


void update(int poz,int val)
{
	for ( ; poz<=n; poz+= poz & (-poz))
		bit[poz]+=val;
}

int getsum(int poz)
{

	int sum;
	for (sum=0 ; poz ; poz-= poz & (-poz))
		sum+=bit[poz];
	return sum;
}

int getpoz(int x) 
{
   int i=n,pp=p;
   for ( ; pp ; pp>>=1)
   	 if (i-pp > 0 && getsum(i-pp)>=x)
   	 	i-=pp;
    
    if (getsum(i)==x) return i;
 
    return -1;  
}


int main(int argc, char const *argv[])
{
	FILE * in =fopen("aib.in","r");
	FILE * out=fopen("aib.out","w");

    n=next_int(in);
    m=next_int(in);

    for (p=1;p<=n;p<<=1);

    for (i=0;i<n;++i)
    {
    	x=next_int(in);
    	update(i+1,x);
    }

    while (m--)
    {
    	x=next_int(in);
    	y=next_int(in);
    	
    	if (x!=2)
    		z=next_int(in);

    	if (x==0)
    		update(y,z); else 
    	if (x==1)
    		fprintf(out,"%d\n",getsum(z)-getsum(y-1)); else 
    	      fprintf(out,"%d\n",getpoz(y));
    }



	fclose(in);
	fclose(out);
	return 0;
}