Cod sursa(job #2330585)

Utilizator ptudortudor P ptudor Data 28 ianuarie 2019 17:06:38
Problema Distincte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("distincte.in");
ofstream out("distincte.out");
const int nmax=100005;
pair <int,int> querys[nmax];
int n,k,m,a[nmax],aib[nmax],st;
queue <int> valori[nmax];
void update(int p,int x)
{
    for (;p<=n;p+=(p&(-p)))
        aib[p]+=x;
}
int query(int p)
{
    int s=0;
  //  cout<<"a";
    for (;p>0;p-=(p&(-p)))
        s+=aib[p];
    return s;
}
void advance(int T)
{int i,x;
    for (;st<T;st++)
    {
        x=a[st];
        valori[x].pop();
        if (!valori[x].empty())
        {
            update(st,-x);
            update(valori[x].front(),x);
        }
    }
}
int main()
{
    in>>n>>k>>m;
    int i,q,w;
    for (i=1;i<=n;i++)in>>a[i];
    for (i=1;i<=m;i++)
    {
        in>>q>>w;
        querys[i]={q,w};
    }
    sort (querys+1,querys+1+m);
    st=querys[1].first;
    int x;
    for (i=st;i<=n;i++)
    {
        x=a[i];
        valori[x].push(i);
        if (valori[x].size()==1)update(i,x);
    }
    for (i=1;i<=m;i++)
    {
        if (st<querys[i].first)
        {
            advance(querys[i].first);
        }
        out<<query(querys[i].second)<<"\n";
    }
    out.close();
    in.close();
    return 0;
}