Cod sursa(job #1996024)

Utilizator infomaxInfomax infomax Data 29 iunie 2017 18:38:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>

using namespace std;

FILE *F = fopen("arbint.in", "r"), *G = fopen("arbint.out", "w");
int n, m, v[100003], t[400003], j, x, y, z, ans, k, p;
const int inf = (-1) << 30;

void upd(int rad, int st, int dr)
{
    if(st == dr)
    {
        t[rad] = k;
        return;
    }
    int mij = (st + dr) >> 1;
    if(p <= mij) upd(2*rad+1, st, mij);
    else upd(2*rad+2, mij+1, dr);
    t[rad] = max(t[2*rad+1], t[2*rad+2]);
}

void Max(int l, int r, int st, int dr, int rad)
{
    if(st >= l && dr <= r){ans = max(ans, t[rad]); return;}///total overlap
    if(l > dr || st > r) return;///no overlap
    int mij = (st + dr) >> 1;
    Max(l, r, st, mij, 2*rad+1);
    Max(l, r, mij + 1, dr, 2*rad+2);
}

int main()
{
    fscanf(F, "%d%d ", &n, &m);
    for(int i = 0; i < n; ++ i)
    {
        fscanf(F, "%d ", &v[i]);
        k = v[i];
        p = i;
        upd(0, 0, n - 1);
    }
    for(int i = 0; i < m; ++ i)
    {
        fscanf(F, "%d%d%d ", &x, &y, &z);
        if(!x)
        {
            ans = -1000;
            Max(y - 1, z - 1, 0, n-1, 0);
            fprintf(G, "%d\n", ans);
        }
        else
        {
            p = y - 1;
            k= z;
            upd(0, 0, n-1);
        }
    }
    return 0;
}