Cod sursa(job #73747)

Utilizator DastasIonescu Vlad Dastas Data 20 iulie 2007 18:09:52
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 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];

void updatex(int nod, int st, int dr)
{
    if ( st == dr )
    {
        arb[nod] = a[st];
        return;
    }

    int m = (st + dr) >> 1;
    updatex((nod<<1), st, m);
    updatex((nod<<1)+1, m+1, dr);

    arb[nod] = arb[nod<<1] + arb[(nod<<1)+1];
}

int r = 0, p1, p2;
void queryx(int nod, int st, int dr)
{
    if ( p1 <= st && dr <= p2 )
    {
        r += arb[nod];
        return;
    }

    if ( st == dr )
        return;

    int m = (st + dr) >> 1;
    queryx((nod<<1), st, m);
    queryx((nod<<1)+1, m+1, dr);
}

void goAdeIntervale()
{
    for ( int i = 1; i <= n; ++i )
        fscanf(in, "%d", &a[i]);

    updatex(1, 1, n);

    int op;
    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d %d", &op, &p1, &p2);
        if ( op == 0 )
            a[p1] -= p2, updatex(1, 1, n);
        else
            r = 0, queryx(1, 1, n), fprintf(out, "%d\n", r);
    }
}

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

    goAdeIntervale();
    //goAIB();


	return 0;
}