Cod sursa(job #1258230)

Utilizator Yasin_ibraimIbraim Yasin Yasin_ibraim Data 8 noiembrie 2014 17:05:55
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<fstream>

using namespace std;

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

long int m,n,p1,p2,temp,a[100001],b[200001],Max=0,c;
bool assume;

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

    if(start == end) b[node]=a[c];
    else if(mid+1<=c && c<=end)
    {
        abc(2*node+1, mid+1,end);
        b[node]=maxim(b[2*node],b[2*node+1]);
    }
    else if(start<=c && c<=mid)
    {
        abc(2*node,start,mid);
        b[node]=maxim(b[2*node], b[2*node+1]);
    }
}
void search(int node,int start,int end,int p1,int p2)
{
    int mid=(start+end)/2;
    if(start==p1 && p2==end && Max<b[node]) Max=b[node];
    else if(p1>=mid+1 && p2<=end) search(2*node+1,mid+1,end,p1,p2);
    else if(p1>=start && p2<=mid) search(2*node,start,mid,p1,p2);
    else if(p1<=mid+1 && p2<=end)
    {
        search(1,1,n,p1,mid);
        search(2*node+1,mid+1,end,p1,p2);
    }
    else if(p1>=start && p2>mid)
    {
        search(1,1,n,mid+1,p2);
        search(2*node,start,mid,p1,mid);
    }
}
int main()
{
    fin>>n>>m;
    for(c=1;c<=n;c++)
    {
        fin>>a[c];
        abc(1,1,n);
    }
    for(int i=0;i<m;i++)
    {
        fin>>assume>>p1>>p2;
        if(assume==0)
        {
            Max=0;
            search(1,1,n,p1,p2);
            fout<<Max;
        }
        else if(assume==1)
        {
            c=p1;
            temp=a[c];
            a[c]=p2;
            abc(1,1,n);
        }
    }
}