Cod sursa(job #1258211)

Utilizator Yasin_ibraimIbraim Yasin Yasin_ibraim Data 8 noiembrie 2014 16:44:56
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>

using namespace std;

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

int m,n,p1,p2,temp,x,a[100000],b[100000];
int Max=0;
bool assume;

int maxim(int a,int b)
{
    if(a<b) return b;
    else return b;
}
void abc(int node,int y,int z)
{
    int mid=(y+z)/2;

    if(y==z) b[node]=a[x];

    else if(y<=x && x<=mid)
    {
        abc(2*node,y,mid);
        b[node]=maxim( b[2*node] , b[2*node+1] );
    }
    else if(mid+1<=x && x<=z)
    {
        abc(2*node+1,mid+1,z);
        b[node]= maxim( b[2*node] , b[2*node+1] );
    }
}
void search(int node,int y,int z,int p1,int p2)
{
    int mid=(y+z)/2;

    if(y==p1 && z==p2)  if(Max<b[node]) Max=b[node];

    else if(p1>=z && p2<=mid) search(2*node, y, mid, p1, p2);

    else if(p1>=mid+1 && p2<=z) search(2*node+1, mid+1, z, p1, p2);

    else if(p1>=y && p2>mid)
    {
        search(1, 1, n, mid+1, p2);
        search(2*node, y, mid, p1, mid);
    }

    else if(p1<=mid+1 && p2<=z)
    {
        search(1,1,n,p1,mid);
        search(2*node+1,mid+1,z,p1,p2);
    }
}
int main()
{
    fin>>n>>m;

    for(x=1;x<=n;x++)
    {
        fin>>a[x];
        abc(1,1,n);
    }
    for(int i=0;i<m;i++)
    {
        fin>>assume>>p1>>p2;
        if(assume==1)
        {
            Max=0;
            search(1,1,n,p1,p2);
            fout<<Max;
        }
        else if(assume==0)
        {
            x=p1;
            a[x]=p2;
            temp=a[x];
            abc(1,1,n);
        }
    }
}