Cod sursa(job #1948548)

Utilizator AlbertJuniorAlbert Ramona AlbertJunior Data 1 aprilie 2017 11:05:37
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <cstdio>
#define NMAX 100005

using namespace std;

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

int n, m, summ, t, arb[NMAX], a, b, mn, x;

void citire();
void update(int a, int b);
void updateminus(int a, int b);
void suma(int a, int b);
int cautareBin(int dr, int st);


int main()
{
    citire();
    return 0;
}

void citire()
{
    int i, q;
    fscanf(f, "%d %d", &n, &m);
    for (i=1;i<=n;i++)
    {
        fscanf(f, "%d", &x);
        update(i, x);

    }


    for (i=0;i<m;i++)
    {
        fscanf(f, "%d", &q);
        if (q==0)
        {
            fscanf(f, "%d %d", &a, &b);
            updateminus(a, b);
        }
        if (q==1)
        {
            fscanf(f, "%d %d", &a, &b);
            summ=0;

            suma(a, b);
            fprintf(g, "%d\n", summ);
        }
        if (q==2)
        {
            fscanf(f, "%d", &b);
            fprintf(g, "%d\n", cautareBin(1, n));
        }



    }
}


int cautareBin(int st, int dr)
{
    int mij;
    if (st<=dr)
    {
        mij=(st+dr)/2;
        summ=0;
        suma(1, mij);
        if (summ==b) return mij;
        if (summ>b)
            return cautareBin(st, mij-1);
        if (summ<b)
            return cautareBin(mij+1, dr);
    }else
    return -1;
}


void updateminus(int a, int b)
{
    int i;
    int t=a^(-a);
    for (i=a;i<=n;)
    {
        arb[i]-=b;
        t=i&(-i);
        i+=t;

    }
}

void update(int a, int b)
{
    int i;
    int t=a^(-a);
    for (i=a;i<=n;)
    {
        arb[i]+=b;
        t=i&(-i);
        i+=t;

    }
}

void suma(int a, int b)
{
    int t, i;

     for (i=b; i>0;)
    {
        summ+=arb[i];
        t=i&(-i);
        i-=t;
    }
    for (i=a-1; i>0;)
    {
        summ-=arb[i];
        t=i&(-i);
        i-=t;
    }

}