Cod sursa(job #1779220)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 14 octombrie 2016 22:46:40
Problema Distincte Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int nmax=100000;
struct nod
{
    long long sum;
    nod * fiust,*fiudr;
    nod()
    {
        sum=0;
        fiust=fiudr=NULL;
    };
};
struct sp
{
    long long ans;
    int st,dr,po;
} inter[nmax+5];

int in[nmax+5],lv[nmax+5],last[nmax+5];
long long ai[nmax+5];
void prop(nod * rot)
{
    if(rot->fiust==NULL)
        rot->fiust=new nod();
    if(rot->fiudr==NULL)
        rot->fiudr=new nod();
}
int lsb(int i)
{
    return i & (-i);
}
void update(int le,int ri,int val)
{
    int i;
for(i=le-1;i>0;i=i-lsb(i))
    ai[i]-=val;
for(i=ri;i>0;i=i-(lsb(i)))
    ai[i]+=val;
}
bool cmp(sp a1,sp a2)
{
    return a1.dr<a2.dr;
}
long long query(int st,int dr)
{
    int i;
long long ans=0;
for(i=st;i<=nmax;i=i+lsb(i))
    ans+=ai[i];
for(i=dr+1;i<=nmax;i=i+lsb(i))
    ans-=ai[i];
return ans;
}
bool ini(sp a1,sp a2)
{
    return a1.po<a2.po;
}
int main()
{
    freopen("distincte.in","r",stdin);
    freopen("distincte.out","w",stdout);
    int n,m,k,i,j;
    nod * root=new nod();
    scanf("%d%d%d",&n,&k,&m);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&in[i]);
        last[i]=lv[in[i]];
        lv[in[i]]=i;
    }
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&inter[i].st,&inter[i].dr);
        inter[i].po=i;
    }
    sort(inter+1,inter+m+1,cmp);
    for(i=1; i<=m; i++)
    {
        for(j=inter[i-1].dr+1; j<=inter[i].dr; j++)
        {
            update(1,j,in[j]);
            if(last[j]!=0)
                update(1,last[j],-in[j]);
        }
        inter[i].ans=query(inter[i].st,inter[i].dr);

    }
    sort(inter+1,inter+m+1,ini);
    for(i=1; i<=m; i++)
        cout<<inter[i].ans<<"\n";
    return 0;
}