Cod sursa(job #2095602)

Utilizator mihai.alphamihai craciun mihai.alpha Data 27 decembrie 2017 19:20:55
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>

FILE *fin, *fout;

#define MAX 1 << 18

int M, N;
int v[MAX], arb[MAX * 2 + 2], ans1;

inline int maxi(int a, int b)  {
    if(a > b)
        return a;
    return b;
}

void update(int rad, int poz, int val, int st, int dr)  {
    if(st > dr)
        return;
    if(st == dr)  {
        arb[rad] = val;
        return;
    }
    if(st <= poz && (st + dr) / 2 >= poz)
        update(rad * 2, poz, val, st, (st + dr) / 2);
    else if((st + dr) / 2 + 1 <= poz && dr >= poz)
        update(rad * 2 + 1, poz, val, (st + dr) / 2 + 1, dr);
    arb[rad] = maxi(arb[rad * 2], arb[rad * 2 + 1]);
}

void query(int rad, int a, int b, int st, int dr)  {
    if(st > dr)
        return;
    if(a <= st && b >= dr)  {
        ans1 = maxi(arb[rad], ans1);
        if(st == dr)
            return;
    }
    else  {
        if(st == dr)
            return;
        query(rad * 2, a, b, st, (st + dr) / 2);
        query(rad * 2 + 1, a, b, (st + dr) / 2 + 1, dr);
    }
}

int main()  {
    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");
    fscanf(fin, "%d%d", &N, &M);
    for(int i = 1;i <= N;i++)  {
        fscanf(fin, "%d", &v[i]);
        update(1, i, v[i], 1, N);
    }
    for(int i = 1;i <= M;i++)  {
        int op, a, b;
        printf("%d ", arb[1]);
        ans1 = 0;
        printf("%d\n", arb[1]);
printf
        fscanf(fin, "%d%d%d", &op, &a, &b);
        if(op == 0)
            query(1, a, b, 1, N), fprintf(fout, "%d\n", ans1);
        else
            update(1, a, b, 1, N);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}