Cod sursa(job #1683813)

Utilizator cojocarugabiReality cojocarugabi Data 10 aprilie 2016 16:43:11
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
# include <bits/stdc++.h>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
struct treap
{
    int key,pr,mx;
    int id,cnt;
    treap *l,*r;
    treap(int key) : key(key),pr(rand()+1),l(0),r(0) {upd();}
    treap(int key,int pr,treap * l,treap * r) : key(key),pr(pr),l(l),r(r) {upd();}
    treap(void) : key(0),pr(rand()+1),l(0),r(0) {upd();}
    void upd(void)
    {
        mx = key;
        cnt = 1;
        if (l) mx = max(mx,l->mx),cnt += l->cnt;
        id = cnt;
        if (r) mx = max(mx,r->mx),cnt += r->cnt;
    }
};
typedef treap *tp;
tp Root = 0;
tp Merge(tp a,tp b)
{
    if (!a) return b;
    if (!b) return a;
    if (a->pr > b->pr)
    {
        a->r = Merge(a->r,b);
        a->upd();
        return a;
    }
    else
    {
        b->l = Merge(a,b->l);
        b->upd();
        return b;
    }
}
void split(tp w,int key,tp &left,tp &right)
{
    left = right = 0;
    if (!w) return;
    if (w->id <= key)
    {
        split(w->r,key - w->id,w->r,right);
        left = w;
    }
    else
    {
        split(w->l,key,left,w->l);
        right = w;
    }
    if (left) left->upd();
    if (right) right->upd();
}
void print(tp w)
{
    if (!w) return;
    print(w->l);
    cerr << w->key << ' ';
    print(w->r);
}
void add(int pos,int val)
{
    tp left,right;
    split(Root,pos-1,left,right);
    Root = Merge(Merge(left,new treap(val)),right);
}
void del(int pos)
{
    tp left,right,nw;
    split(Root,pos-1,left,right);
    split(right,1,right,nw);
    Root = Merge(left,nw);
}
int query(int p,int u)
{
    tp left,m,right;
    split(Root,p-1,left,right);
    split(right,u-p+1,m,right);
    int ans = m->mx;
    Root = Merge(Merge(left,m),right);
    return ans;
}
int main(void)
{
    int n,m;
    ios_base :: sync_with_stdio(0);
    fi>>n>>m;
    for (int i = 1;i <= n;++i)
    {
        int val;
        fi>>val;
        add(i,val);
    }
    while (m --)
    {
        int op,p,u;
        fi>>op>>p>>u;
        if (op) del(p),add(p,u);
        else fo << query(p,u) << '\n';
    }
    return 0;
}