Cod sursa(job #2151565)

Utilizator DACSTEPStepan Dacian DACSTEP Data 4 martie 2018 17:10:13
Problema Distincte Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("distincte.in");
ofstream g("distincte.out");
int n,k,m,val,i,v[100005],st,dr,p,ml=0,mr=-1;
struct qu
{
    int le,rg,poz,vl;
} w[100005];
void mord(int s, int d, int k)
{
    for(int i=1; i<=k; i++)
    {
        if(s/p==w[i].le/p && d<w[i].rg)
        {
            for(int j=k+1; j>=i+1; j--)
            {
                w[j].le=w[j-1].le;
                w[j].rg=w[j-1].rg;
                w[j].poz=w[j-1].poz;
            }
            w[i].le=s;
            w[i].rg=d;
            w[i].poz=k;
            i=k+1;
        }
        else if(s/p<w[i].le/p)
        {
            for(int j=k+1; j>=i+1; j--)
            {
                w[j].le=w[j-1].le;
                w[j].rg=w[j-1].rg;
                w[j].poz=w[j-1].poz;
            }
            w[i].le=s;
            w[i].rg=d;
            w[i].poz=k;
            i=k+1;
        }
    }
}
int cata(int x, int y, int z)
{
    int t=1;
    for(int i=x; i<=y; i++)
        if(z==v[i])
            t=0;
    return t;
}
int main()
{
    f>>n>>k>>m;
    p=sqrt(n);                //BLOCK_SIZE=n;
    for(i=1; i<=n; i++)
        f>>v[i];
    w[1].le=n+1;
    w[1].rg=n+1;
    for(i=1; i<=m; i++)
    {
        f>>st>>dr;
        mord(st,dr,i);
    }

    for(i=1; i<=m; i++)
    {
        while(mr<w[i].rg)
        {
            mr++;
            if(cata(ml,mr-1,v[mr])==1)
                val=val+v[mr];
        }
        while(mr>w[i].rg)
        {
            mr--;
            if(cata(ml,mr,v[mr+1])==1)
                val=val-v[mr+1];
        }
        while(ml>w[i].le)
        {
            ml--;
            if(cata(ml+1,mr,v[ml])==1)
                val=val+v[ml];
        }
        while(ml<w[i].le)
        {
            ml++;
            if(cata(ml,mr,v[ml-1])==1)
                val=val-v[ml-1];
        }
        w[i].vl=val;
    }
    /*for(i=1; i<=m+1; i++)
        g<<w[i].le<<' '<<w[i].rg<<' '<<w[i].poz<<' '<<w[i].vl<<endl;
    g<<endl;*/
    for(i=1;i<=m;i++)
    {
        k=1;
        while(w[k].poz!=i)
            k++;
        g<<w[k].vl<<endl;
    }
    return 0;
}