Cod sursa(job #2146885)

Utilizator dragos231456Neghina Dragos dragos231456 Data 28 februarie 2018 12:02:56
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <map>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
int mn[1000005],mx[1000005],dif[1000005],n,val,v[300005],query[300005];
int rez,x,k,ch,line,nr,val,fr[300005]; string s,t[300005];
map<int,int> mp;

void citire()
{
    while(getline(f,s))
        {
            ch=0; ++line;
            while(s[ch]<='Z' && s[ch]>='A')
            {
                t[line]+=s[ch];
                ++ch;
            }
            if(t[line].size()==1)
            {
                ++ch;
                while(s[ch]<='9' && s[ch]>='0')
                {
                    query[line]=query[line]*10+s[ch]-'0';
                    ++ch;
                }
                v[++k]=query[line];
            }
        }
}

void normalizare()
{
    sort(v+1,v+k+1);
    for(int i=1;i<=k;++i)
    {
        if(v[i]!=v[i-1])
        {
           ++n;
           mp[v[i]]=n;
           fr[n]=v[i];
        }
    }
    for(int i=1;i<=line;++i)
    {
        if(query[i]!=0) query[i]=mp[query[i]];
    }
}

void update(int nod,int lt,int rt,int poz)
{
    if(lt==rt)
    {
        mn[nod]=mx[nod]=val;
        return;
    }
    int md=(lt+rt)/2;
    if(poz<=md) update(nod*2,lt,md,poz);
    else update(nod*2+1,md+1,rt,poz);

    mn[arb]=min(mn[arb*2],mn[arb*2+1]); if(mn[arb]==0) mn[arb]=mn[arb*2]+mn[arb*2+1];
    mx[arb]=max(mx[arb*2],mx[arb*2+1]);
}

void upddif(int nod,int lt,int rt,int poz)
{
    if(lt==rt)
    {
        dif[arb]+=val;
        return;
    }
    int md=(lt+rt)/2;
    if(poz<=md) upddif(nod*2,lt,md,poz);
    else update(nod*2+1,md+1,rt,poz);

    ///conditie
}

void add(int x)
{
    val=x; ++nr; update(1,1,n,x);
    if(nr>1)
    {
        i1=i2=0;
        query1(1,1,n); ///cel mai mare numar mai mic decat x in i1
        query2(1,1,n); ///cel mai mic numar mai mare decat x
        if(i1 && i2)
        {
            val=-1; upddif(1,1,n,i2-i1);
            val=1; upddif(1,1,n,i2-x); upddif(1,1,n,x-i1);
        }
    }
}

int main()
{
    citire();
    normalizare();
    for(int i=1;i<=line;++i)
    {
        if(t[i]=='I') add(query[i]);
    }
    return 0;
}