Cod sursa(job #1439471)

Utilizator dyanagGrigore Diana dyanag Data 22 mai 2015 13:46:58
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <fstream>
#include<cstring>
using namespace std;

FILE *f=fopen("aib.in", "r");
FILE *g=fopen("aib.out", "w");

int v[100001], c, n, m, s, t;

inline int Minim(int a, int b) {
    if (a< b)
        return a;
    return b;
}

int searchk(int val){
    int i, step;
    for(step=1; step<n; step=step<<1);
    for(i=0; step; step=step>>1)
         if(i+step<=n)
            if(val>=v[i+step]){
                i+=step, val-=v[i];
                if(val==0)
                    return i;
            }
    return -1;
}

void add(int poz, int val){
     c=0;
     while(poz<=n){
           v[poz]+=val;
           while(!(poz&(1<<c)))
                ++c;
           poz+=(1<<c);
           c+=1;
     }
}

int Q(int poz){
    c=0, s=0;
    while(poz>0){
          s+=v[poz];
          while(!(poz&(1<<c)))
            ++c;
          poz-=(1<<c);
          c+=1;
    }
    return s;
}


int main()
{
    int k, x, y;
    fscanf(f, "%d%d", &n, &m);
    for(int i=1; i<=n; ++i){
        fscanf(f, "%d", &t);
        add(i,t);
    }
    for(int i=1; i<=m; ++i){
        fscanf(f, "%d", &k);
        if (k<2){
             fscanf(f, "%d%d", &x, &y);
             if(k==0)
                add(x,y);
             else
                fprintf(g, "%d\n", Q(y)-Q(x-1));
        }
        else{
            fscanf(f, "%d", &x);
            fprintf(g, "%d\n", searchk(x));
        }
    }
return 0;
}