Cod sursa(job #1532947)

Utilizator AdrianVrAdrian Stefan Vramulet AdrianVr Data 21 noiembrie 2015 21:01:36
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <vector>
#define Nmax 100000
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
vector <int> A;//daca foloseam int A[4*dimensiunea], explicatia e ca diferenta la puteri e mai mare
int v,M,N,a,b,x,e,l;
int query(int nod, int st, int dr)
{
    if(a<=st&&b>=dr)
        return A[nod];
    else
    {
        int mij=0;
        int t1=-1,t2=-1;
        mij=(st+dr)/2;
        if(a<=mij)
            t1=query(2*nod,st,mij);
        if(b>mij)
            t2=query(2*nod+1,mij+1,dr);

        if(t1>=t2)
            return t1;
        return t2;
    }
}
void update(int nod,int st,int dr)
{
    if(a<=st && b>=dr)//st=dr=e;
    {
        A[nod]=l;//valoarea de pe poz A[nod] ia valoarea l
        return;
    }
    else
    {
        int mij=0;
        mij=(st+dr)/2;
        if(a<=mij)
            update(2*nod,st,mij);
        if(b>mij)
            update(2*nod+1,mij+1,dr);
        A[nod]=max(A[2*nod],A[2*nod+1]);
    }
}
int main()
{
    int i;
    f>>N>>M;
for(i=0;i<=2*N;i++)
    A.push_back(0);
    for(i=1; i<=N; i++)
    {
        f>>v;
        a=i;
        b=i;
        l=v;
        update(1,1,N);
  /*      for( int j=1;j<=2*N;j++)
    g<<A[j]<<' '; g<<v<<' '<<endl;
*/
    }
  /*for(i=1;i<=2*N;i++)
    g<<A[i]<<' ';*/
    for(i=1; i<=M; i++)
    {
        f>>x>>e>>l;
        if(!x)
        {
            a=e;
            b=l;
            g<<query(1,1,N);
            g<<'\n';
        }
        else
        {
            a=e;
            b=e;//intervalul se modifica cu o singura valoare
            update(1,1,N);
        }
    }
f.close();
g.close();
    return 0;
}