Cod sursa(job #1133867)

Utilizator omerOmer Cerrahoglu omer Data 5 martie 2014 19:09:45
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include<stdio.h>
using namespace std;
FILE *f,*g;
int v[229000];
int q=1,N,M;
void update(int a,int b)
    {
        int i=a+q;
        while(i>0) {v[i]+=b;i/=2;}
    }
void sum(int a,int b)
    {
        a+=q;b+=q;
        if (a==b) fprintf(g,"%d\n",v[a]);
        else
            {
                int s=v[a]+v[b];
                while(a/2!=b/2)
                    {
                        if (a%2==0) s+=v[a+1];
                        if(b%2==1) s+=v[b-1];
                        a/=2;b/=2;
                    }
                fprintf(g,"%d\n",s);

            }
    }
void query(int a)
    {
        int curr=1;
        while(v[curr]!=a&&curr<<1<=N+q)
            {
                if (v[curr*2]>=a) curr*=2;
                else
                    {
                        a-=v[curr*2];
                        curr=curr*2+1;
                    }
            }
        if (v[curr]==a) {while((curr*2+1)<=N+q) curr=curr*2+1;if (curr>q) fprintf(g,"%d\n",curr-q); else fprintf(g,"%d",N);}
        else {fprintf(g,"-1\n");}
    }




int main()
{
    int a,b,x,i;
    f=fopen("aib.in","r");
    g=fopen("aib.out","w");
    fscanf(f,"%d%d",&N,&M);
    while (q<N) q*=2;
    q--;
    for(i=1;i<=N;i++) {fscanf(f,"%d",&x);update(i,x);}
    for(i=1;i<=M;i++)
        {
            fscanf(f,"%d",&x);
            if (x==0) {fscanf(f,"%d%d",&a,&b);update(a,b);}
            if (x==1) {fscanf(f,"%d%d",&a,&b);sum(a,b);}
            if (x==2) {fscanf(f,"%d",&a); query(a);}
        }
    return 0;
}