Cod sursa(job #695979)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 28 februarie 2012 16:04:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

int n,m,maxi[400100],pos,val,maxim,sta,fin;

int max(const int &a,const int &b) {
    return a>b ? a : b;
}

void update(int nod,int l,int r) {

     if(l == r) {
          maxi[nod] = val;
          return;
     }

     int div=(l + r)/2;
     if(pos <= div)
        update(2*nod,l,div);
     else
        update(2*nod+1,div+1,r);

     maxi[nod] = max(maxi[2*nod], maxi[2*nod+1]);

}

void query(int nod, int l, int r) {

     if(sta <= l && r <= fin) {
          if(maxim < maxi[nod]) maxim = maxi[nod];
          return;
     }

     int div = (l + r)/2;
     if(sta <= div)
        query(2*nod,l,div);
     if(div < fin)
        query(2*nod+1,div+1,r);

}

int main() {
    int i,x,a,b;

    in >> n >> m;

    for(i=1;i<=n;++i) {

        in >> x;

        pos=i; val=x;
        update(1,1,n);

    }

    for(i=1;i<=m;++i) {

        in >> x >> a >> b;

        if(x==1) {

            pos = a; val = b;
            update(1,1,n);

        }
        else {

            maxim=-1;
            sta=a; fin=b;
            query(1,1,n);

            out << maxim << "\n";

        }

    }

    return 0;
}