Cod sursa(job #423352)

Utilizator DastasIonescu Vlad Dastas Data 23 martie 2010 19:40:05
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <cstdio>

#define maxn 15001

FILE *in = fopen("datorii.in","r"), *out = fopen("datorii.out","w");

int n, m;

int b[maxn]; // AIB

int query(int x)
{
    int r = 0;

    while ( x )
        r += b[x], x -= (x&(x-1))^x;

    return r;
}

void update(int x, int val)
{
    while ( x <= n )
        b[x] += val, x += (x&(x-1))^x;
}

void goAIB()
{
    int a, c, d;
    for ( int i = 1; i <= n; ++i )
        fscanf(in, "%d", &a), update(i, a);

    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d %d", &a, &c, &d);
        if ( a )
            fprintf(out, "%d\n", query(d) - query(c-1));
        else
            update(c, -d);
    }

}
//
//int a[maxn];
//int arb[(2<<13)+1];
//
//void build(int nod, int st, int dr)
//{
//    if ( st == dr )
//    {
//        arb[nod] = a[st];
//        return;
//    }
//
//    int m = (st + dr) >> 1;
//    int q = nod << 1;
//
//    build(q, st, m);
//    build(q+1, m+1, dr);
//
//    arb[nod] = arb[q] + arb[q+1];
//}
//
//int p;
//void updatex(int nod, int st, int dr)
//{
//    if ( st == dr )
//    {
//        arb[nod] = a[st];
//        return;
//    }
//
//    if ( p < st || p > dr  )
//        return;
//
//    int m = (st + dr) >> 1;
//    int q = nod << 1;
//
//    updatex(q, st, m);
//    updatex(q+1, m+1, dr);
//
//    arb[nod] = arb[q] + arb[q+1];
//}
//
//int r = 0, p1, p2;
//void queryx(int nod, int st, int dr)
//{
//    if ( p1 <= st && dr <= p2 )
//    {
//        r += arb[nod];
//        return;
//    }
//
//    int m = (st + dr) >> 1;
//    int q = nod << 1;
//
//    if ( st == dr )
//        return;
//
//    queryx(q, st, m);
//    queryx(q+1, m+1, dr);
//}
//
//void goAdeIntervale()
//{
//    for ( int i = 1; i <= n; ++i )
//        fscanf(in, "%d", &a[i]);
//
//    build(1, 1, n);
//
//    int op, t, d;
//    for ( int i = 1; i <= m; ++i )
//    {
//        fscanf(in, "%d %d %d", &op, &t, &d);
//        if ( op == 0 )
//            a[t] -= d, p = t, updatex(1, 1, n);
//        else
//            r = 0, p1 = t, p2 = d, queryx(1, 1, n), fprintf(out, "%d\n", r);
//    }
//}

int main()
{
    fscanf(in, "%d %d", &n, &m);

    //goAdeIntervale();
    goAIB();


	return 0;
}