Cod sursa(job #1467291)

Utilizator SilviuIIon Silviu SilviuI Data 3 august 2015 10:33:25
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <time.h>
#include <bitset>
#include <string>
#include <vector>
#include <math.h>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <limits.h>
#include <algorithm>
#include <deque>
#define nmax 100010
#define mod 1999999973
using namespace std;
int n,m,aib[nmax],tip,i,j,x,y,st,dr,mm,sol,b;
inline int lsb(int x) { return (x&(-x)); }
void update(int i,int x)
{
    for (;i<=n;i+=lsb(i)) aib[i]+=x;
}
int query(int i)
{
    int sum=0;
    for (;i>0;i-=lsb(i)) sum=sum+aib[i];
    return sum;
}
int main() {
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=1;i<=n;i++) {
    scanf("%d",&x); update(i,x);
}
for (i=1;i<=m;i++) {
    scanf("%d",&tip);
    if (tip==0) { scanf("%d %d",&x,&y); update(x,y); } else
        if (tip==1) { scanf("%d %d",&x,&y); printf("%d\n",query(y)-query(x-1)); } else
        {
            scanf("%d",&x); st=1; dr=n; sol=-1;
            while (st<=dr) {
                mm=(st+dr)/2; b=query(mm);
                if (b==x) sol=mm,dr=mm-1; else
                if (b>x) dr=mm-1; else st=mm+1;
            }
            printf("%d\n",mm);
        }
}
return 0;
}