Cod sursa(job #2016695)

Utilizator workwork work work Data 30 august 2017 00:43:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

FILE *F=fopen("arbint.in", "r"), *G=fopen("arbint.out", "w");

int n, m, q, x, y, ans, p, k, v[100005], t[400005];

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 qry(int st, int dr, int l, int r, int rad)
{
    if(st >= l && r >= dr) {ans = max(ans, t[rad]);return;}
    if(l > dr || r < st) return;
    int mij = (st+dr)>>1;
    qry(st, mij, l, r, 2*rad+1);
    qry(mij+1, dr, l, r, 2*rad+2);
}

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