Cod sursa(job #73806)

Utilizator DastasIonescu Vlad Dastas Data 20 iulie 2007 23:29:47
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 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(stdout, "%d\n", query(d) - query(c-1));
//        else
//            update(c, -d);
//    }
//
//}

int a[maxn];
int arb[(2<<14)+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;
    }

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

    if ( p >= st && p <= m )
        updatex(q, st, m);
    if ( p > m && p <= dr )
        updatex(q+1, m+1, dr);

    arb[nod] = arb[q] + arb[q+1];
}

int r, 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;

    if ( p1 <= st && m <= p2 )
        queryx(q, st, m);
    else
        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;
}