Cod sursa(job #1133982)

Utilizator omerOmer Cerrahoglu omer Data 5 martie 2014 21:21:20
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include<stdio.h>
using namespace std;
FILE *f,*g;
long long v[50000];
int q=1,N,M,j,a,b,curr;
long long s;
void update(void)
    {
        j=a+q;
        while(j>0) {v[j]+=b;j/=2;}
    }
void sum(void)
    {
        a+=q;b+=q;
        if (a==b) fprintf(g,"%lld\n",v[a]);
        else
            {
                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,"%lld\n",s);

            }
    }
void query(void)
    {
        curr=1;
        while(v[curr]!=a&&curr*2<=N+q)
            {
                if (v[curr*2]>=a) curr*=2;
                else
                    {
                        a=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 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(a=1;a<=N;a++) {fscanf(f,"%d",&b);update();}
    for(i=1;i<=M;i++)
        {
            fscanf(f,"%d",&x);
            if (x==0) {fscanf(f,"%d%d",&a,&b);update();}
            if (x==1) {fscanf(f,"%d%d",&a,&b);sum();}
            if (x==2) {fscanf(f,"%d",&a); query();}
        }
    return 0;
}