Cod sursa(job #1058462)

Utilizator cioionutFMI Ionut Ciocoiu cioionut Data 15 decembrie 2013 16:11:01
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<iostream>
#include<fstream>
using namespace std;
int n,b,a,m,arb[200002],v[100001],i;
int z(int nod,int st,int dr)
{
    long m=(st+dr)/2;
    if(st==a&&b>dr) return arb[nod];
    if(a<=m) z(nod*2,st,m);
            else z(nod*2+1,m+1,dr);
}
int e(int nod,int st,int dr)
{
    long m=(st+dr)/2;
    if(dr==b&&a<st) return arb[nod];
    if(b<=m) e(nod*2,st,m);
            else e(nod*2+1,m+1,dr);
}
int zero(int st,int dr)
{
    //cout<<z(arb,1,a,b,st,dr)<<" "<<e(arb,1,a,b,st,dr)<<"\n";
    return max(z(1,st,dr),e(1,st,dr));
}
void unu(int nod,int st,int dr)
{
    long m=(st+dr)/2;
    if(st==dr&&st==a) {arb[nod]=b;return;}
       else if(st==dr) return;
    else if(st==dr) return;
    if (a<=m) unu(nod*2,st,m);
        else unu(nod*2+1,m+1,dr);
    if(arb[nod*2]>arb[nod*2+1]) arb[nod]=arb[nod*2];
                else arb[nod]=arb[nod*2+1];
}
void create(int nod,int st,int dr)
{
    if(st==dr) {arb[nod]=v[st];return;}
    create(nod*2,st,(st+dr)/2);
    create(nod*2+1,(st+dr)/2+1,dr);
    if(arb[nod*2]>arb[nod*2+1]) arb[nod]=arb[nod*2];
                else arb[nod]=arb[nod*2+1];
}
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    bool o;
    f>>n>>m;
    for(i=1;i<=n;i++) f>>v[i];
    create(1,1,n);
    for(i=1;i<=m;i++)
    {
        f>>o>>a>>b;
        if(o) unu(1,1,n);
        else g<<zero(1,n)<<"\n";
    }
   // for(i=1;i<=2*n-1;i++) cout<<arb[i]<<" ";
    f.close();g.close();
    return 0;
}